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)실행될 때 ;
-
:first는 Symbol 객체이므로&:firstmap 메소드에 매개 변수로 제공되면 Symbol # to_proc이 호출됩니다. -
map은 매개 변수를 사용하여 호출 메시지를 : first.to_proc로 보냅니다 .
[1,'a']예를 들어,:first.to_proc.call([1,'a'])실행됩니다. -
Symbol 클래스의 to_proc 프로시 저는
[1,'a']매개 변수 (: first) 를 사용하여 전송 메시지를 배열 객체 ( )로 보냅니다[1,'a'].send(:first). -
[[1,'a'],[2,'b'],[3,'c']]객체 의 나머지 요소를 반복 합니다.
이는 [[1,'a'],[2,'b'],[3,'c']].map(|e| e.first)표현식 실행과 동일 합니다.
