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.
Отказ от ответственности: Я проверил код выше, но я не нашел явных ссылок для проверки моего заявления.
Update
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.
Update 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
Можете ли вы привести пример какой проверки? Я немного потерял то, что вы подразумеваете под этим. Но у меня есть подозрение, что это очень возможно, просто нужно уточнить. – mwilliams 2008-10-13 14:10:59
Просто потому, что что-то возможно, это не значит, что это хорошая идея. ;) – epochwolf 2008-10-13 14:12:35
Повышение исключения - это, безусловно, рубиновый способ сделать это. – rampion 2009-04-08 19:32:26