2015-11-09 3 views
2

Недавно я столкнулся с странностью, глядя на некоторый код Ruby от Rails docs.Почему в Ruby иногда требуются скобки?

Рубин позволяет передавать аргументы, как эти примеры:

redirect_to post_url(@post), alert: "Watch it, mister!" 
redirect_to({ action: 'atom' }, alert: "Something serious happened") 

Но второй случай выглядел странно для меня. Похоже, что вы должны быть в состоянии передать его следующим образом:

redirect_to { action: 'atom' }, alert: "Something serious happened" 

И это будет иметь такое же значение, с или без скобок. Но вместо этого вы получаете:

syntax error, unexpected ':', expecting '}' 

Ссылаясь на толстой кишке после action. Я не уверен, почему он ожидал бы }, и почему использование скобок изменило бы это.

ответ

5

Потому что { ... } имеет два значения: хеш-литераль и блок.

Рассмотрим это:

%w(foo bar baz).select { |x| x[0] == "b" } 
# => ["bar", "baz"] 

Здесь { ... } является блок.

Теперь представьте, что вы вызываете метод на текущем объекте, поэтому явный приемник не требуется:

select { |x| x[0]] == "b" } 

Теперь представьте, что вы не заботитесь о параметре:

select { true } 

Здесь { true } все еще блок, а не хэш. И поэтому в вызове функции:

redirect_to { action: 'atom' } 

(в основном) эквивалентно

redirect_to do 
    action: 'atom' 
end 

и это нонсенс. Однако

redirect_to({ action: atom' }) 

имеет список аргументов, состоящий из хэша.

4

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

redirect_to do 
    action: 'atom' 
end, alert: "Something serious happened" 

Поэтому ваш action: 'atom', который не действует как независимое выражение, получает анализируется как таковой.

Скобки служат для устранения неоднозначности {...} как хеша.

+0

Эй, что с нисходящим? Этот ответ правильный. – acobster

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

  • Нет связанных вопросов^_^