0

ルビーを始めたばかりで、頭をブロックに巻き付けることができません

匿名関数とはどう違うのですか?

どのインスタンスでそれを使用したいですか?

そして、匿名関数よりもいつそれを選択しますか?

4

1 に答える 1

4

Rubyには、JavaScriptのような無名関数はありませんたとえば)。ブロックには3つの基本的な用途があります。

  1. Procの作成
  2. ラムダの作成
  3. 機能付き

ブロックが無名関数に似ている例はここにあります(RubyとJavaScript)。

ルビー:

[1,2,3,4,5].each do |e| #do starts the block
  puts e
end #end ends it

JS(jQuery):

$.each([1,2,3,4,5], function(e) { //Anonymous *function* starts here
  console.log(e);
}); //Ends here

Rubyブロック(および無名関数)の力は、それらを任意のメソッド(定義したメソッドを含む)に渡すことができるという事実です。したがって、独自の各メソッドが必要な場合は、次のように実行できます。

class Array
  def my_each
    i = 0
    while(i<self.length)
      yield self[i]
      i+=1
    end
  end
end

たとえば、次のようなメソッドを宣言すると、次のようになります。

def foo(&block)
end

block渡されたブロックを表すProcオブジェクトです。したがってProc.new、次のようになります。

def Proc.new(&block)
  block
end

ブロックは、必然的に、メソッドにバインドされます。それらは、私が上で説明したような方法によってのみオブジェクトに変換することができます。の正確な実装はわかりませんがlambda(追加の引数チェックを行います)、同じ考えです。

したがって、ブロックの基本的な考え方は次のとおりです。引数Procによってオブジェクトに含めるか、キーワードによって呼び出すことができる、メソッドにバインドされたコードのブロック。&yield

于 2012-09-12T00:20:28.130 に答える