Использование лямбды по умолчанию в Hash # fetch ruby - PullRequest
0 голосов
/ 06 февраля 2019

Я читал уверенный в себе рубин и пытался определить способ многократного использования.Из приведенных примеров я написал следующее:

DEFAULT_BLOCK = -> { 'block executed' }

answers = {}

answers.fetch(:x, &DEFAULT_BLOCK)

Я ожидал, что он вернет block executed, поскольку x не найден в хэше, а вместо этого вернул wrong number of arguments (given 1, expected 0) (ArgumentError).В чем может быть проблема?Я не дал блоку аргумент.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

У вас есть, вы просто этого не видите:

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

answers = {}

answers.fetch(:x, &WHAT_AM_I_PASSING)
# => ":x"

Блок Hash#fetch содержит аргумент, ключ, который вы не нашли.Вы можете либо принять аргумент в своей лямбде и просто проигнорировать его, либо сделать его процедурой:

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

Причина, по которой работает процесс, заключается в том, что лямбда-выражения проверяют, что во время выполнения процедур было указано правильное количество аргументов.нет.Метод fetch вызывает proc / lambda с одним аргументом (ключом).

0 голосов
/ 06 февраля 2019
    2.6.1 :014 > DEFAULT_BLOCK = -> { 'block executed' }
     => #<Proc:0x00005586f6ef9e58@(irb):14 (lambda)> 
    2.6.1 :015 > answers = {}
     => {} 
    2.6.1 :016 > ans = answers.fetch(:x) {DEFAULT_BLOCK}
     => #<Proc:0x00005586f6ef9e58@(irb):14 (lambda)> 
    2.6.1 :017 > ans.call
     => "block executed" 

    Actually we can pass default value for key so that if key not found in the hash it use this default value like,
    my_hash = {}
     => {} 
    2.6.1 :019 > my_hash[:key1] = 'val1'
     => "val1" 
    2.6.1 :020 > p my_hash
    {:key1=>"val1"}
     => {:key1=>"val1"} 
    2.6.1 :022 > my_hash.fetch(:key1)
     => "val1" 
    2.6.1 :023 > my_hash.fetch(:key2)
    KeyError (key not found: :key2)
    Did you mean?  :key1
    2.6.1 :024 > my_hash.fetch(:key2){'val2'}
     => "val2" 
0 голосов
/ 06 февраля 2019

Когда Hash#fetch принимает блок, ключ передается в блок.Но ваш блок, созданный из proc, не принимает никакого аргумента блока.Измените определение на:

DEFAULT_BLOCK = -> x { 'block executed' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...