質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

3638閲覧

Ruby 受け取ったブロックを変数に代入したい

wingtss

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2014/09/03 09:33

Rubyで受け取ったブロックを変数に代入したいのですが、
どうすればできますか?
何か良い方法等あれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yohshiy

総合スコア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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wingtss

2014/09/08 00:21

丁寧な回答ありがとうございました!参考にさせていただきます!
guest

0

Procを使い、仮引数に&で修飾した引数をおけばいけるかと思います。
そうすれば、他のメソッド呼び出しの引数にすることができます。

投稿2014/09/04 07:30

japanese_ninja

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問