目次
block / Proc / lambda の違い
参考:
Ruby の ブロック、Proc.new、lambda の違い – Qiita
Ruby のブロックと Proc と lambda と Method について | gaaamii のブログ
Ruby のブロックと Proc と、ときどき lambda | blog 紫陽花
singleton method Proc.new (Ruby 2.6.0)
module function Kernel.#lambda (Ruby 2.6.0)
return / next / break の違い
return
:メソッドを抜ける。return
に引数を指定するとメソッドの戻り値となる。next
:次のループに進む。break
:ブロックから抜ける。break
に引数を指定するとブロックの戻り値となる。
参考:
ruby の block 文での break, next – Qiita
break, next, redo の違い | Worth Living
How to break out from a ruby block? – Stack Overflow
手続きオブジェクトにおける return / next / break の挙動の違い
手続きオブジェクト (Procedures Object) を生成する手段によって、内部で return
/ next
/ break
を実行した場合の挙動が異なる。
メソッド内で各手続きオブジェクトを生成して、同じメソッド内で各手続きオブジェクトに含まれる return
/ next
/ break
を実行した場合の違いは次のようになる。
return | next | break | |
Proc.new | メソッドを抜ける | 手続きを抜ける | 例外が発生する |
---|---|---|---|
proc | メソッドを抜ける | 手続きを抜ける | 例外が発生する |
lambda | 手続きを抜ける | 手続きを抜ける | 手続きを抜ける |
イテレーター | メソッドを抜ける | 次の繰り返しに進む | 手続きを抜ける (繰り返しを終了する) |
メソッド内で各手続きオブジェクトを生成して、メソッドを抜けてから各手続きオブジェクトに含まれる return
/ next
/ break
を実行した場合の違いは次のようになる。
return | next | break | |
Proc.new | 例外が発生する | 手続きを抜ける | 例外が発生する |
---|---|---|---|
proc | 例外が発生する | 手続きを抜ける | 例外が発生する |
lambda | 手続きを抜ける | 手続きを抜ける | 手続きを抜ける |
メソッド内で一時的な手続きを作成して、その内部で return
によりメソッドを抜けたい場合に proc
もしくは Proc.new
を使用する。それ以外の場合は lambda
を使用しておけば不用意な例外発生の抑止となる。(lambda
では return
/ next
/ break
のいずれも手続きを抜ける動作となる。)
参考:
module function Kernel.#lambda (Ruby 2.6.0)
ブロック付き呼び出し
参考:
instance method Symbol#to_proc (Ruby 2.6.0)
yield
引数をブロックパラメータとして渡して、ブロックを実行する。yield *args
は block.call(*args)
と同じ働きをする。
参考:
yield – メソッド呼び出し (super・ブロック付き・yield) (Ruby 2.6.0)
block/proc/lambda の使いどころ – Qiita
ブロックの戻り値
def say puts yield end say { "hello" } # => prints: hello
yield
はブロックの戻り値を返す。
ブロックを明示的にメソッドの引数 (Proc
オブジェクト) として受け取った場合、call
(Proc
における yield
メソッドの別名) を実行することでブロックの戻り値が返される。
def say &block puts block.call end
ブロックの代わりに Proc
オブジェクトや lambda
を受け取ることができる。
メソッドが受け取るブロックは一つと決まっているので、block.call
の代わりに yield
と書くことができる。
def say(&proc) puts proc.call if block_given? end say{ "hello" } # => prints: hello hello = Proc.new{ "hello" } say(&hello) # => prints: hello bye = -> { "bye" } say(&bye) # => prints: bye def hey "Hey!" end say(&method(:hey)) # => prints: Hey!
method(:hey)
の呼び出しにより hey
メソッドが、レシーバー main:Object
と結び付けられた Method
オブジェクトとなる。
method(:hey).call # => prints: Hey!
method(:hey)
は、self.method(:hey)
として解釈され、mtehod(:hey).call
はトップレベルにおける self.hey
の呼び出しと等価になる。
参考:
Ruby の yield って結局なんなの? | YNote
Ruby のブロック、ブロック引数、Proc、yield をまとめてみた | Java からの Ruby on Rails 入門
yield でのコードの書き方について – teratail
yield – メソッド呼び出し (super・ブロック付き・yield) (Ruby 2.6.0)
イテレーターとブロック
参考:
Ruby の yield が難しい。| OnsenとRuby
Ruby でのイテレータを使った繰り返し | vivid memo
block_given?
参考:
module function Kernel.#block_given? (Ruby 2.6.0)
カリー化 / 部分適用
参考:
instance method Proc#curry (Ruby 2.6.0)
instance method Method#curry (Ruby 2.6.0)
ラップした proc にコンテキストを引き継ぐ
参考:
Wrap a Ruby function – Stack Overflow
Proc
参考:
arity
Proc
オブジェクトが受け付ける引数の数を返す。可変長引数を受け付ける場合は負の整数を返す。
- 正の整数:指定された数の引数を受け付ける
0
:引数を受け付けない- 負の整数:必須の引数の数を
n
とすると- (n + 1)
が返される
参考: