“숨겨진 기능 …”meme을 계속하면서, 루비 프로그래밍 언어의 덜 알려졌지만 유용한 기능을 공유해 보자.
Ruby on Rails를 사용하지 않고 핵심 Ruby로이 토론을 제한하십시오.
또한보십시오:
( 답변 당 하나의 숨겨진 기능 만 제공하십시오 .)
감사합니다
답변
Ruby 1.9부터 Proc # ===는 Proc # call의 별칭으로 Proc 객체는 다음과 같은 경우에 사용할 수 있습니다.
def multiple_of(factor)
Proc.new{|product| product.modulo(factor).zero?}
end
case number
when multiple_of(3)
puts "Multiple of 3"
when multiple_of(7)
puts "Multiple of 7"
end
답변
피터 쿠퍼는이 좋은 목록 루비 트릭을. 아마도 내가 가장 좋아하는 것은 단일 항목과 컬렉션을 모두 열거하는 것입니다. 즉, 비 컬렉션 오브젝트는 해당 오브젝트 만 포함하는 콜렉션으로 취급합니다.
[*items].each do |item|
# ...
end
답변
이것이 어떻게 숨겨져 있는지 모르지만 1 차원 배열에서 해시를 만들어야 할 때 유용하다는 것을 알았습니다.
fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]
Hash[*fruit]
=> {"apple"=>"red", "banana"=>"yellow"}
답변
내가 좋아하는 트릭은 *
Array 이외의 객체 에서 splat ( ) 확장기 를 사용하는 것입니다. 정규식 일치에 대한 예는 다음과 같습니다.
match, text, number = *"Something 981".match(/([A-z]*) ([0-9]*)/)
다른 예는 다음과 같습니다.
a, b, c = *('A'..'Z')
Job = Struct.new(:name, :occupation)
tom = Job.new("Tom", "Developer")
name, occupation = *tom
답변
와우, 플립 플롭 연산자에 대해서는 아무도 언급하지 않았습니다 :
1.upto(100) do |i|
puts i if (i == 3)..(i == 15)
end
답변
루비의 멋진 점 중 하나는 메소드 또는 클래스 정의와 같이 다른 언어가 찌푸린 곳에서 메소드를 호출하고 코드를 실행할 수 있다는 것입니다.
예를 들어, 런타임까지 알 수없는 수퍼 클래스가있는 클래스를 작성하려면 (예 : 임의) 다음을 수행하십시오.
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
이것은 1.9 Array#sample
방법 (1.8.7 전용, 참조 Array#choice
)을 사용하며 예제는 꽤 고안되었지만 여기에서 힘을 볼 수 있습니다.
또 다른 멋진 예는 고정되지 않은 기본 매개 변수 값을 넣는 기능입니다 (다른 언어가 자주 요구하는 것처럼).
def do_something_at(something, at = Time.now)
# ...
end
물론 첫 번째 예제의 문제점은 호출 시간이 아니라 정의 시간에 평가된다는 것입니다. 따라서 수퍼 클래스가 선택되면 나머지 프로그램의 수퍼 클래스가 유지됩니다.
그러나 두 번째 예에서 전화 할 때마다 do_something_at
의 at
변수는 메소드가 호출 된 시간이 될 것입니다 (물론, 아주 아주 가까운 그것에)
답변
또 다른 작은 기능- Fixnum
최대 36까지의 기지 로 변환 :
>> 1234567890.to_s(2)
=> "1001001100101100000001011010010"
>> 1234567890.to_s(8)
=> "11145401322"
>> 1234567890.to_s(16)
=> "499602d2"
>> 1234567890.to_s(24)
=> "6b1230i"
>> 1234567890.to_s(36)
=> "kf12oi"
Huw Walters가 언급했듯이 다른 방법으로 변환하는 것은 간단합니다.
>> "kf12oi".to_i(36)
=> 1234567890