class Test
def var=(var)
@var = var
return true
end
end
t1, t2 = Test.new, Test.new
t1.var = 123 # evaluates to 123
# Why is it impossible to return something else:
t1.var = t2.var = 456
Как указано в комментарии: я считаю, что невозможно изменить возвращаемое значение, чтобы разрешить цепные присвоения. В любом случае, изменение возвращаемого значения будет неожиданным для большинства программистов на Ruby.
Отказ от ответственности: я тестировал приведенный выше код, но не нашел явных ссылок для проверки своего утверждения.
Обновление
class Test
def method_missing(method, *args)
if method == :var=
# check something
@var = args[0]
return true
else
super(method, *args)
end
end
def var
@var
end
end
t = Test.new
t.var = 123 # evaluates to 123
t.does_not_exists # NoMethodError
Это действительно кажется невозможным! Приведенный выше пример показывает, что возвращаемое значение вообще не связано с методом var=
. Вы не можете изменить это поведение - это основной способ работы назначений Ruby.
Обновление 2: решение найдено
Вы можете вызвать исключение!
class Test
def var=(var)
raise ArgumentError if var < 100 # or some other condition
@var = var
end
def var
@var
end
end
t = Test.new
t.var = 123 # 123
t.var = 1 # ArgumentError raised
t.var # 123