Значение if
должно преобразовываться в true, если переменная отличается от nil
или false
(и будет ошибка, если переменная не определена).Я не уверен, что есть способ переопределить объект, который определен так, чтобы возвращать ноль или ложь (это не смущает большинство программистов на Ruby), но мне было бы интересно услышать от других.
Чтовы можете добавить метод, возвращающий значение nil
или false
, и использовать его вместо этого:
class MyObject
def foo?
false
end
end
obj = MyObject.new
if obj.foo?
puts "true"
else
puts "false"
end
Обновление: метод new
можно переопределить, чтобы получить логическое значение, а неobject.
class MyObject
attr_reader :var
def initialize(*args)
args.each do |a|
puts a
end
end
def self.new(*args, &block)
super
false
end
end
my_object = MyObject.new(:a, :b)
if !my_object
puts 'Hello, world!'
end
my_object = MyObject.new
if !my_object
puts 'Hello, world!'
end
С этим может быть любое количество побочных эффектов, так как вы в основном конвертировали экземпляр объекта в логическое значение.Хотя это может быть интересным исследованием, но я, вероятно, буду придерживаться изменения своего назначения или выполнения проверки defined?
, is_a?
, nil?
или иным образом.