docs/iolite.md in iolite-0.0.1 vs docs/iolite.md in iolite-0.0.2

- old
+ new

@@ -195,10 +195,11 @@ ["homu", "mami", "mado"].select &it =~ /^m/ # => ["mami", "mado"] ``` + ## プレースホルダ プレースホルダは任意の引数値に対して遅延評価を行うために使用します。 プレースホルダは arg1 〜 arg10 まで定義されており、argN 番目の引数に対応します。 これは module Iolite::Placeholders で定義されています。 @@ -231,9 +232,44 @@ (1..5).map &arg1.to_s(2) # => ["1", "10", "11", "100", "101"] [:homu, :mami, :an].select &arg1.to_s.length > 3 # => [:homu, :mami] +``` + +## Proc と併用して使用する + +定義した式の中で `Iolite::Lazy` やプレースホルダ使用すると評価時に `Iolite::Lazy` オブジェクトが遅延評価されます。 +しかし、Proc などを渡した場合には `Iolite::Lazy` のように評価時に処理は行われません。 + +```ruby +a = Iolite::Lazy.new { |it| it } +b = Proc.new { |it| it + it } + +# Proc は遅延評価されないので 3 + Proc が行われようとしてエラーになる +p (a + b).call(3) +# => error: `+': Proc can't be coerced into Fixnum (TypeError) +``` + +これは、意図しない副作用を抑えるためにデフォルトでは Proc は遅延評価を行わないようにしているからです。 +Proc も同様に評価して欲しい場合は以下の `require` を追加してモンキーパッチを適用してください。 + +```ruby +# モンキーパチを適用させるための require +require "iolite/adaptored/proc_with_callable" + +a = Iolite::Lazy.new { |it| it } +b = Proc.new { |it| it + it } + +# Proc が遅延評価されるようになるので +# a.call(3) + b.call(3) +# と評価される +(a + b).call(3) +# => 9 + +# こんな使い方とか +p (arg1 + :to_s.to_proc.call(arg2)).call("homu", 42) +# => "homu42" ``` ## Object#to_lazy `Object#to_lazy` は自身を遅延評価するオブジェクト(Iolite::Lazy オブジェクト)として返すメソッドです。