`let` はおもしろ・おそろしい

[`evernote` not found]
LINEで送る
LinkedIn にシェア

# 遅延評価の素晴らしさ

– 素晴らしいという話は他にもたくさん紹介されているので、そちらをご参照あれ。

# おそろしや(自分がハマった3つの罠)

① 書き方には要注意

let (:hoge) {...} では働かない
let(:hoge) {...} と、スペースを入れないようにしよう。私はこれで恥ずかしながら半日潰した。^^;;

② 呼ばれないと評価自体されない

たとえば、コントローラーのメソッドhoge_specは「すべてのUserオブジェクトのうち、その属性xyz99が入っているものは除外して、インスタンス変数@usersに代入する」という仕様であった場合、

さて、上記のテストコード、おやっ?と思った人はかなり戦ってきた人である。
これは、このテストコード自体に問題がある。たとえコントローラーのhoge_specで、Userオブジェクトの属性xyz9999のものを外すコードを書いてしまっても、このテストコードでは見事パスしてしまうのだ!これは問題だ。テストにならん。

種明かしは後ほど。

③ exampleの中では最後のもののみが有効

遅延評価なので、次のような書き方ができるときっと楽しい。

こう書けたら、さぞかし楽だろう。しかし、そうは問屋がおろさなかった。この場合、モデルにきちんと

としておいても、上の2つが、falseではなく、trueだと言われてエラーになってしまう。

そうなのだ。

最後にセットされた”花咲婆さん”がこのexample内で有効になっているためである。
なので、仕方がないからそれぞれcontextで分けなければならない。

となる。

さてさて、最後に②の種明かし…

をするはずだったが、わからなかった御仁はどうか自分でやってみてほしい。
これは、決して、いじわるじゃないぞ。

コメントを残す