我正在阅读自信的红宝石,我正在尝试如何定义可重用的过程.从给出的例子中,我写道:
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).问题是什么?我还没有给出一个论点.
你有,你只是看不到它:
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.