[ruby] 루비의 숨겨진 기능

“숨겨진 기능 …”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_atat변수는 메소드가 호출 된 시간이 될 것입니다 (물론, 아주 아주 가까운 그것에)


답변

또 다른 작은 기능- 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