2015-03-22 3 views
3

У меня есть такое определение класса:Последнее выражение оценивается в Рубине

class Test 
    attr_accessor :state 

    def multiple_state=(times) 
    @state *= times 
    end 
end 

obj = Test.new 
obj.state = 2 
puts #{obj.multiple_state=4} 

Я думал, что выход 8, сог, что это значение последнего вычисленного выражения в multiple_state. (?)

Но выход 4.

ли мое понимание последнего выражения оценивается неправильно?

Спасибо.

ответ

5

Синтаксический сахар Ruby для методов setter всегда возвращает правую часть задания, даже если вы делаете что-то еще в своем методе. Хорошо обоснованный рубист ставит его лучше, чем я мог:

Сетчатые методы не возвращают то, что вы думаете. Когда вы используете синтаксический сахар, который позволяет совершать вызовы для = методов, которые выглядят как назначения, Ruby серьезно относится к семантике присваивания. Задания (например, x = 1) оценивают все, что находится на их правой стороне. Обычно методы возвращают значение последнего выражения, оцененного во время выполнения. Но = вызовы метода ведут себя как присваивания: значение выражения ticket.price = 63.00 равно 63.00, даже если метод ticket = возвращает строку «Ха-ха!». Идея состоит в том, чтобы сохранить семантику согласованной. Под капотом это вызов метода; но выглядит как назначение и ведет себя как присваивание по отношению к его значению как выражение.

The Обоснованно Rubyist - Глава 3.3.3

+0

Спасибо так много. – totally

+0

Итак, даже если у вас есть оператор return явно in = method, значение по-прежнему остается правым? нравится всегда 63.0? что, если я хочу вернуть что-то? или что-то бессмысленное в = методе? – totally

+2

Возвращаемое значение метода не имеет смысла. Он будет возвращен из метода. Но присваивания всегда оценивают значение, которое назначается. Таким образом, вы не можете использовать синтаксис назначения для вызова метода. Но вы можете использовать 'public_send',' send' или '__send__'. –

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