[ruby] 루비에서 map (& : name)은 무엇을 의미합니까?

RailsCast 에서이 코드를 찾았 습니다 .

def tag_names
  @tag_names || tags.map(&:name).join(' ')
end

무엇은하지 (&:name)map(&:name)평균?



답변

속기입니다 tags.map(&:name.to_proc).join(' ')

경우 fooA의 객체 인 to_proc방법은, 당신은 같은 방법으로 전달할 수 있습니다 &foo호출, foo.to_proc및 방법의 블록으로 사용하는 것이.

Symbol#to_proc메소드는 원래 ActiveSupport에 의해 추가되었지만 Ruby 1.8.7에 통합되었습니다. 이것이 그 구현입니다.

class Symbol
  def to_proc
    Proc.new do |obj, *args|
      obj.send self, *args
    end
  end
end


답변

많은 사람들에게 알려지지 않은 또 다른 멋진 속기는

array.each(&method(:foo))

이것은 속기입니다

array.each { |element| foo(element) }

호출 하여 메소드 를 나타내는 객체를 method(:foo)가져 와서 Method객체 를로 변환 하는 메소드 가 있음을 나타냅니다 .selffoo&to_proc Proc

포인트없는 스타일 로 작업 할 때 매우 유용합니다 . 예를 들어 배열에 문자열과 같은 문자열이 있는지 확인하는 것입니다 "foo". 일반적인 방법이 있습니다.

["bar", "baz", "foo"].any? { |str| str == "foo" }

그리고 포인트없는 방법이 있습니다.

["bar", "baz", "foo"].any?(&"foo".method(:==))

가장 좋은 방법은 가장 읽기 쉬운 방법이어야합니다.


답변

그것은 동등하다

def tag_names
  @tag_names || tags.map { |tag| tag.name }.join(' ')
end


답변

앰퍼샌드와 #to_proc매직은 Symbol뿐만 아니라 모든 클래스에서 작동 할 수 있습니다. 많은 Rubyist #to_proc가 Array 클래스 에서 정의하기로 선택합니다 .

class Array
  def to_proc
    proc { |receiver| receiver.send *self }
  end
end

# And then...

[ 'Hello', 'Goodbye' ].map &[ :+, ' world!' ]
#=> ["Hello world!", "Goodbye world!"]

앰퍼샌드 &to_proc위 코드에서 Array 클래스의 피연산자에 메시지를 보내서 작동합니다 . 그리고 #to_proc배열에서 메소드를 정의 했으므로 줄은 다음과 같습니다.

[ 'Hello', 'Goodbye' ].map { |receiver| receiver.send( :+, ' world!' ) }


답변

속기입니다 tags.map { |tag| tag.name }.join(' ')


답변

tags.map(&:name)

와 같다

tags.map{|tag| tag.name}

&:name 호출 할 메소드 이름으로 기호를 사용합니다.


답변

Josh Lee의 대답은 동등한 Ruby 코드가 다음과 같아야한다는 점을 제외하면 거의 정확합니다.

class Symbol
  def to_proc
    Proc.new do |receiver|
      receiver.send self
    end
  end
end

아니

class Symbol
  def to_proc
    Proc.new do |obj, *args|
      obj.send self, *args
    end
  end
end

이 코드 때 print [[1,'a'],[2,'b'],[3,'c']].map(&:first)실행되고, 루비 제의 입력을 분리 [1,'a']한 내로 ‘A’에 환원 obj1 args*‘A'(입니다 제)에있어서 자기가없는 Fixnum이라는 오브젝트 1과 같은 에러를 야기.


[[1,'a'],[2,'b'],[3,'c']].map(&:first)실행될 때 ;

  1. :first는 Symbol 객체이므로 &:firstmap 메소드에 매개 변수로 제공되면 Symbol # to_proc이 호출됩니다.

  2. map은 매개 변수를 사용하여 호출 메시지를 : first.to_proc로 보냅니다 . [1,'a']예를 들어, :first.to_proc.call([1,'a'])실행됩니다.

  3. Symbol 클래스의 to_proc 프로시 저는 [1,'a']매개 변수 (: first) 를 사용하여 전송 메시지를 배열 객체 ( )로 보냅니다 [1,'a'].send(:first).

  4. [[1,'a'],[2,'b'],[3,'c']]객체 의 나머지 요소를 반복 합니다.

이는 [[1,'a'],[2,'b'],[3,'c']].map(|e| e.first)표현식 실행과 동일 합니다.