3

&:ご存知のように、接頭辞によってメソッドを反復子メソッドに渡すことができます。
例えば:

["a", "b"].map(&:upcase) #=> ["A", "B"] 
def rettwo
  2
end
["a", "b"].map(&:rettwo) #=> [2, 2]

ここに問題があります。メソッドを作成し、プレフィックス付きのメソッドを渡す&:と、「ArgumentError: no receiver given」というエラー メッセージが表示されました。
コードを示しましょう:

def a_simple_method &proc
  puts proc.class # it shows `Proc`
  proc.call
end
def a_iterator_method
  puts yield
end

a_simple_method &:rettwo #=> ArgumentError: no receiver given
a_iterator_method &:rettwo #=> ArgumentError: no receiver given

何が欠けているのか、map配列の like メソッドがそれをどのように処理するか

4

1 に答える 1

4

これが機能するものです。以下説明。

class String
  def rettwo
    self + self
  end
end

def a_simple_method &proc
  proc.call('a')
end

def a_iterator_method
  yield 'b'
end

a_simple_method(&:rettwo) # => "aa"
a_iterator_method(&:rettwo) # => "bb"

この&:構造は と呼ばれSymbol#to_procます。シンボルをプロシージャに変換します。このプロシージャは、最初の引数としてレシーバーを想定しています。残りの引数は、proc を呼び出すために使用されます。引数を渡していないため、「レシーバーが指定されていません」というエラーが発生します。

追加の引数のデモを次に示します。

class String
  def say name
    "#{self} #{name}"
  end
end

def a_simple_method &proc
  proc.call('hello', 'ruby')
end


a_simple_method(&:say) # => "hello ruby"

これは、2008 年のブログ投稿からの Symbol#to_proc の定義です。最新の Symbol#to_proc は C で実装されているようですが、それでも理解に役立ちます。

class Symbol
  def to_proc
    Proc.new { |*args| args.shift.__send__(self, *args) }
  end
end
于 2012-11-13T17:23:47.453 に答える