루비에서 지도(&:name)는 무엇을 의미합니까?
RailsCast에서 이 코드를 찾았습니다.
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
입니까?(&:name)
map(&:name)
비열한?
▁for▁shorth▁its의 줄임말입니다.tags.map(&:name.to_proc).join(' ')
한다면foo
는 가있객니다체가 입니다.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
의 입니다.self
은 그것의 것을나는내를 나타냅니다.foo
방법, 그리고 사용했습니다.&
그것이 있다는 것을 의미합니다.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
tags.map(&:name)
와 같습니까?
tags.map{|tag| tag.name}
&:name
는 호출할 메서드 이름으로 기호를 사용합니다.
암퍼샌드는 우리가#to_proc
마법은 심볼뿐만 아니라 모든 클래스에서 작동할 수 있습니다.많은 루비스트들이 정의하기를 선택합니다.#to_proc
어레이 클래스:
class Array
def to_proc
proc { |receiver| receiver.send *self }
end
end
# And then...
[ 'Hello', 'Goodbye' ].map &[ :+, ' world!' ]
#=> ["Hello world!", "Goodbye world!"]
주&
보내는 방법에 의한 작업to_proc
메시지가 피연산자에 표시됩니다. 위 코드에서는 배열 클래스입니다.그리고 내가 정의한 이후로#to_proc
배열에서 메소드, 행은 다음과 같습니다.
[ 'Hello', 'Goodbye' ].map { |receiver| receiver.send( :+, ' world!' ) }
▁for▁shorth▁its의 줄임말입니다.tags.map { |tag| tag.name }.join(' ')
여기서 두 가지 일이 일어나고 있습니다. 두 가지를 모두 이해하는 것이 중요합니다.
답변에서 처럼, 다른답변설바같이와명한서에,,Symbol#to_proc
메서드를 호출하는 중입니다.
그 는 ㅠㅠㅠㅠㅠㅠㅠto_proc
기호에서 호출되는 것은 그것이 전달되기 때문입니다.map
일괄 논의로서배치&
메서드 호출의 인수 앞에서 이 방식으로 전달됩니다.이것은 루비 메서드에 대해서만 해당되는 것이 아닙니다.map
기호가 있는
def some_method(*args, &block)
puts "args: #{args.inspect}"
puts "block: #{block.inspect}"
end
some_method(:whatever)
# args: [:whatever]
# block: nil
some_method(&:whatever)
# args: []
# block: #<Proc:0x007fd23d010da8>
some_method(&"whatever")
# TypeError: wrong argument type String (expected Proc)
# (String doesn't respond to #to_proc)
그Symbol
됩니다.Proc
왜냐하면 그것은 블록으로 통과되었기 때문입니다.우리는 이것을 증명할 수 있습니다 프록토를 통과하려고 시도함으로써..map
: 앰샌드없이퍼::
arr = %w(apple banana)
reverse_upcase = proc { |i| i.reverse.upcase }
reverse_upcase.is_a?(Proc)
=> true
arr.map(reverse_upcase)
# ArgumentError: wrong number of arguments (1 for 0)
# (map expects 0 positional arguments and one block argument)
arr.map(&reverse_upcase)
=> ["ELPPA", "ANANAB"]
변환할 필요가 없더라도 메서드는 블록 인수를 예상하기 때문에 사용 방법을 알 수 없습니다.전하기와 함께 하기.&
, 주다, 주다, 주다, 주다, 주다, 주다, 주다, 주다, 주다..map
그것이 기대하는 블록.
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']
1에 1을 주다obj
1 그리고args*
Fixnum 개체 1에 메서드 자체(:first)가 없으므로 오류를 발생시키는 'a'.
때[[1,'a'],[2,'b'],[3,'c']].map(&:first)
실행됨;
:first
기호 객체입니다. 따라서&:first
맵 메서드에 매개 변수로 제공되며 Symbol#to_proc가 호출됩니다.은 매개 변수 map을 .to first.to _http:▁_ _http://▁with 에 .
[1,'a']
를 들어, , , .:first.to_proc.call([1,'a'])
실행됩니다.symbol 클래스의 to_proc 프로시저는 배열 객체로 메시지를 보냅니다.
[1,'a']
가 있는 경우,를 들어 ) 매개변예(:first) 니다사(합:first) 를용수예((:first:[1,'a'].send(:first)
실행됩니다.의나 요지대반다니복합의 나머지 에 걸쳐 됩니다.
[[1,'a'],[2,'b'],[3,'c']]
물건.
은 실하는것동다니합일을 실행하는 과 같습니다.[[1,'a'],[2,'b'],[3,'c']].map(|e| e.first)
표현.
.to _http로 (&:name)http (&:name.to _http)와 동일합니다.tags.map{ |t| t.name }.join(' ')
to_proc는 실제로 C에서 구현됩니다.
map(&:name)은 열거형 개체(경우에 따라 다름)를 사용하여 각 요소/태그에 대한 이름 메서드를 실행하여 메서드에서 반환된 각 값을 출력합니다.
의 줄임말입니다.
array.map { |element| element.name }
요소(태그) 이름의 배열을 반환합니다.
첫째번.&:name
는 의바가니다입기로▁for▁shortcut의 바로 가기입니다.&:name.to_proc
서, 디에어:name.to_proc
를 반환합니다.Proc
(하지 않은 것) 를 (첫 인수로 때 (람비슷동않첫것은지객일것체는만하를)를 호출합니다name
그 객체에 대한 메소드.
째둘에, 면반에.&
def foo(&block) ... end
을 전된블 변환니다합을로 합니다.foo
Proc
그것은 a에 적용될 때 반대로 합니다.Proc
.
따라서,&:name.to_proc
객체를 인수로 받아들이고 다음을 호출하는 블록입니다.name
그에대 방법한즉것,, ,, e.{ |o| o.name }
.
이미 훌륭한 답변을 얻었지만 초보자의 관점에서 다음과 같은 추가 정보를 추가하고 싶습니다.
루비에서 지도(&:name)는 무엇을 의미합니까?
즉, 다른 방법을 매개변수로 지도 함수에 전달하는 것입니다.(실제로는 proc로 변환되는 기호를 전달하는 것입니다.하지만 이것은 이 경우에는 그다지 중요하지 않습니다.)
중요한 것은 당신이 가지고 있다는 것입니다.method
이름 지어진name
전통적인 방법 대신에 지도 방법에 의해 인수로 사용될 것입니다.block
라는 합니다.tag.name
배열의 각 태그에 있습니다.
이것은 단순화된 루비 속기입니다.
루비에는 &: 연산자가 없습니다.지금 보시는 것은 :기호에 적용된 & 연산자입니다.
메서드 인수 목록에서 & 연산자는 피연산자를 가져와 (to_proc on) 아직 호출되지 않은 경우 Proc 개체로 변환하고 블록이 사용된 것처럼 메서드에 전달합니다.
my_message = Proc.new {puts "foo"}
my_bullet_call(&my_bullet) #은(는) 다음과 같습니다. my_bullet_call {puts "foo" }
여기서:name
는 방법을 가리키는 기호입니다.name
태그 개체의.우리가 지나갈때&:name
map
은 치료할 입니다.name
로서.간단히 말하면,tags.map(&:name)
다음과 같은 역할을 합니다.
tags.map do |tag|
tag.name
end
라는 뜻입니다.
array.each(&:to_sym.to_proc)
아래와 같습니다.
def tag_names
if @tag_names
@tag_names
else
tags.map{ |t| t.name }.join(' ')
end
언급URL : https://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby
'programing' 카테고리의 다른 글
Python 스크립트의 파일 이름 및 줄 번호 (0) | 2023.06.17 |
---|---|
루비에서 조건 연산자(? :)는 어떻게 사용하나요? (0) | 2023.06.17 |
DeepL API를 사용하여 텍스트 번역 (0) | 2023.06.17 |
pthread_message 및 pthread_message (0) | 2023.06.17 |
vuex에서 약속을 중첩하는 이유는 무엇입니까? (0) | 2023.06.17 |