2

ブロックとプロシージャについて学習しようとしていますが、これは実行可能であるべきだと感じていますが、これまでのところ成功していません。

私が欲しいもの:

def main_action(generic_variable, block)
 generic_variable += 1 # I do more interesting stuff than this in my version
 yield(generic_variable)
end

main_action(3, {|num| num + 5 })

または似たようなもの。

私が見つけた最も近いものはhttp://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.htmlで、ブロックを送信するために passing メソッドを作成する必要があるようでした:

class Monkey

  # Monkey.tell_ape { "ook!" }
  # ape: ook!
  #  => nil
  def self.tell_ape(&block)
    tell("ape", &block)
  end

  def self.tell(name, &block)
    puts "#{name}: #{block.call}"
  end
end

コードで設定された同じ引き渡し方法を使用すると、それを機能させることができますが、不要なコードのようです。Monkey.tell("ape", { "ook!" })直接電話してみましたが、syntax error, unexpected '}', expecting tASSOC

1回の呼び出しで変数とブロック(またはproc、私はうるさいわけではありません)を関数に送信することは可能ですか? また、時間があれば、上で何が起こっているのですか?なぜそれがうまくいかないのですか?

4

2 に答える 2

5

ブロックとプロシージャを混同しているようです。ブロックはルビオブジェクトではありません。あなたはそれを渡すことはできません

foo(args, block)

それを渡す唯一の方法はfoo(args){...}、またはfoo(args) do ... endです。ただし、メソッド定義では、ブロックを受け取り、それを proc に変換して、次のように引数の 1 つとして受け入れることができます。

def foo(args, &block)
  ...
end

一方、次のようにprocオブジェクトを引数として渡すことができます

foo(args, proc)

proc オブジェクトを作成する方法はいくつかあり、ブロック リテラルに近いリテラルは lambda:->{...}ですが、ブロック構文とは異なります{...}。これを使用して、次のことができます

foo(args, ->{...})

だがしかし

foo(args, {...})

{...}がハッシュでない限り。

于 2013-06-15T08:40:32.463 に答える
2

澤さんの回答に基づいMonkey.tellて、ブロックとプロシージャを使用して質問()の関数を再作成できました。ここにあるのは、他の誰かが役に立つと思った場合に備えてです!

def tell_proc(name, proc)
  puts "#{name}: #{proc.call('ook')}"
end
tell_proc('ape', ->(sound) { sound + "!" })

def tell_block(name, &block)
  puts "#{name}: #{block.call('ook')}"
end
tell_block('ape') {|sound| sound + "!" }
于 2013-06-15T09:17:44.577 に答える