Rubyで受け取ったブロックを変数に代入したいのですが、
どうすればできますか?
何か良い方法等あれば教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
メソッドの最後の引数に &
をつけるとそれがブロックを指す変数になります。
その変数は他の変数に渡すことが可能です。
`
def somefunc(num, &blk) # blk がブロックを指す変数
他の変数に代入
foo = blk
関数に渡したい場合は & をつけて展開
(1..num).each(&foo)
end
somefunc(3){|it|
puts it
}
1
2
3
`
ちなみに受け取った blk(foo)
を使いたい場合は &
をつけるとブロックとして展開されます。
可変長の引数を配列として受け取ったり、関数に展開して渡す場合の *
と同じような関係です。
投稿2014/09/04 15:46
総合スコア863
0
ベストアンサー
コード例として、こんなものを見つけました。
RubyのlambdaやProcとblock渡しとコールバック関数
...
コールバック登録関数 Fib#regist_callback(&block) を作り、&blockを普通に配列に貯めて、あとで使う。
...
つまり、block を配列に格納して、後で使うということをしてます。
lang
1 -*- coding: utf-8 -*- 2## 複数のコールバックを登録する例 3 4class Fib 5 def initialize 6 @f0 = 0 7 @f1 = 1 8 @callbacks = Array.new # コールバック関数を保存しておく配列 9 end 10 11 def regist_callback(&block) # コールバック関数を登録する 12 raise ArgumentError, "block not given" unless block_given? # 正しくblockが渡されない場合、エラーを投げる 13 @callbacks.push block 14 end 15 16 def start 17 loop do 18 f2 = @f0 + @f1 # フィボナッチ数列を計算 19 @f0 = @f1 20 @f1 = f2 21 @callbacks.each do |c| ## 全てのコールバック関数を順に呼び出す 22 c.call f2 23 end 24 break if f2 > 1000000 # キリがないので終了 25 end 26 end 27end 28 29## フィボナッチ数計算開始 ## 30fib = Fib.new 31 32# 1つ目のコールバック関数を登録する 33fib.regist_callback do |num| 34 puts "フィボナッチ数列 #{num}" 35end 36 37# 2つ目のコールバック関数を登録する 38fib.regist_callback do |num| 39 puts "result = #{num}" 40end 41 42fib.start ## 計算開始
投稿2014/09/04 13:58
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Procを使い、仮引数に&で修飾した引数をおけばいけるかと思います。
そうすれば、他のメソッド呼び出しの引数にすることができます。
投稿2014/09/04 07:30
総合スコア196
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。