programing

루비에서 지도(&:name)는 무엇을 의미합니까?

powerit 2023. 6. 17. 09:45
반응형

루비에서 지도(&: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을 주다obj1 그리고args*Fixnum 개체 1에 메서드 자체(:first)가 없으므로 오류를 발생시키는 'a'.


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

  1. :first기호 객체입니다. 따라서&:first맵 메서드에 매개 변수로 제공되며 Symbol#to_proc가 호출됩니다.

  2. 은 매개 변수 map을 .to first.to _http:▁_ _http://▁with 에 .[1,'a']를 들어, , , .:first.to_proc.call([1,'a'])실행됩니다.

  3. symbol 클래스의 to_proc 프로시저는 배열 객체로 메시지를 보냅니다.[1,'a']가 있는 경우,를 들어 ) 매개변예(:first) 니다사(합:first) 를용수예((:first:[1,'a'].send(:first)실행됩니다.

  4. 의나 요지대반다니복합의 나머지 에 걸쳐 됩니다.[[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을 전된블 변환니다합을로 합니다.fooProc그것은 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태그 개체의.우리가 지나갈때&:namemap은 치료할 입니다.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

반응형