我最近發現許多ruby方法使用的管道輸入在某些時候並不是必需的,但這似乎不一致。例如,該行創建了昨天,今天,明天字符串數組:Ruby何時需要管道輸入? (| x | x.to_s)
DateTime.now.instance_eval{[prev_day, to_datetime, tomorrow]}.map{|d| d.strftime('%m/%d/%Y')}
=> ["06/20/2016", "06/21/2016", "06/22/2016"]
正如你可以instance_eval的內看到,有沒有管道輸入,函數只是假定方法正在呼籲DateTime.now。但是,如果我嘗試了同樣的想法應用到地圖的方法:
DateTime.now.instance_eval{[prev_day, to_datetime, tomorrow]}.map{strftime('%m/%d/%Y')}
NoMethodError: undefined method `strftime' for main:Object
突然間它試圖利用上主要的方法是什麼?
我的問題是爲什麼在第一種方法而不是第二種方法中工作?
啊哈!回顧一下我的代碼,它總是處理instance_eval。好吧,現在有道理。 – oMiKeY
這實際上與'instance_eval'完全無關。一個更直接的例子是'[1,2,3] .map {chr}'和'[1,2,3] .map {| x | x.chr}'。結果是完全相同的。 –
@Mike:我無法重現你的例子:'[1,2,3] .map {chr}' '的結果NameError:未定義的局部變量或方法'chr'for main:Object' on Ruby 2.3.1 – spickermann