在Hash #fetch ruby​​中使用lambda作为默认值

L.T*_*L.T 7 ruby ruby-hash

我正在阅读自信的红宝石,我正在尝试如何定义可重用的过程.从给出的例子中,我写道:

DEFAULT_BLOCK = -> { 'block executed' }

answers = {}

answers.fetch(:x, &DEFAULT_BLOCK)
Run Code Online (Sandbox Code Playgroud)

我期待它返回,block executed因为x在Hash中找不到它,而是返回它wrong number of arguments (given 1, expected 0) (ArgumentError).问题是什么?我还没有给出一个论点.

Mar*_*iej 9

你有,你只是看不到它:

WHAT_AM_I_PASSING = ->(var) { var.inspect }

answers = {}

answers.fetch(:x, &WHAT_AM_I_PASSING)
# => ":x"
Run Code Online (Sandbox Code Playgroud)

Hash#fetch提供了一个参数,这是你没有找到的关键.您可以接受lambda中的参数并忽略它,或者使其成为proc:

DEFAULT_BLOCK = proc { 'block executed' }
answers.fetch(:x, &DEFAULT_BLOCK)
# => "block executed" 
Run Code Online (Sandbox Code Playgroud)

proc工作的原因是lambdas验证了在procs没有提供正确数量的参数时.该fetch方法使用一个参数(键)调用proc/lambda.