2015-07-16 1 views
4

В приведенном ниже Рубине результатов кода в: unknown keyword: a (ArgumentError):Рубин автоматически расширяет Hash в именованные аргументы без двойного знака

def test(x={}, y: true); end 

test({a:1}) 

Почему? Я ожидаю, что это произойдет с test(**{a:1}), но я не понимаю, почему мой хэш автоматически расширяется без двойного символа.

+1

'x' является необязательным, и Ruby думает, что вы передаете kwargs (поскольку' test (a: 1) 'и' test ({a: 1}) 'эквивалентны, даже до 2.x, но потом он Не важно. Кстати, значение по умолчанию может быть равно '[]' или 'false'. Также есть [отчет об ошибке] (https://bugs.ruby-lang.org/issues/11068). – cremno

+0

Да, это очень странно и неинтуитивно. Рад, что это рассматривается как ошибка. –

ответ

2

Поскольку х не является обязательным, хэш переходит к аргументу kwarg. Произвольные ключевые слова поднимают ошибку в этом случае:

def foo(name:) 
    p name 
end 

foo # raises "ArgumentError: missing keyword: name" as expected 
foo({name: 'Joe', age: 10}) # raises "ArgumentError: unknown keyword: age" 

Заканчивать this статья

1

Я также считаю, это ошибка, как он ведет себя довольно непоследовательно, только для хэшей с ключами Symbol типа:

test({a:1}) # raises ArgumentError 
test({'a' => 1}) # nil, properly assigned to optional argument x 
method(:test).parameters 
=> [[:opt, :x], [:key, :y]] 

Вы можете передать оба аргумента и начать правильно их назначать, но это не решение.

test({a:1}, {y:false}) # nil 

Любая причина, по которой это не ошибка, а ожидаемое поведение?

Смежные вопросы