Ruby 中的 if 语句是否调用特定的对象方法?
Does an if statement in Ruby call a particular object method?
也许我不太了解一些基本的东西,但我想知道在为 if
语句评估对象时是否调用了对象的某些特定方法?
所以,在下面...
my_object = MyObject.new
if !my_object
puts 'Hello, world!'
end
class MyObject
def ___
return false
end
end
...是否有一些方法 ___
可以在 if
调用的对象中定义,以便我可以确定条件的结果? (在上面,输出将是 'Hello, world!')
或者有没有其他方法可以根据 MyObject
的定义控制它在 if
语句中的计算方式?
谢谢。
如果变量不是 nil
或 false
,则 if
应该计算为真(如果变量未定义,将会出错)。我不确定是否有办法覆盖定义为 return nil 或 false 的对象(这不会让大多数 Ruby 程序员感到困惑)但我很想听听其他人的意见.
你可以做的是将一个方法添加到 return 一个 nil
或 false
值并改用它:
class MyObject
def foo?
false
end
end
obj = MyObject.new
if obj.foo?
puts "true"
else
puts "false"
end
更新:您可以将 new
方法重写为 return 布尔值,而不是对象。
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?
检查或其他。
is there some method ___
that I could define within the object that would called by if
, such that I can determine the result of the conditional?
不,不幸的是没有。不幸的是,这是 Ruby 不是面向对象的情况之一。
Ruby 中只有两个虚假对象:false
(很明显)和 nil
。其他一切都是真实的,包括在其他一些语言中被认为是虚假的对象,例如整数 0
、浮点数 0.0
、空字符串 ''
、空数组 []
和空散列 {}
.
面向对象的基本支柱之一是对象可以相互模拟。事实上,有些人认为这是 面向对象的定义特征。然而,无法在 Ruby.
中模拟 false
或 nil
(in the above, the output would be 'Hello, world!')
在这种特殊情况下,您可以通过覆盖 !
来实现这一点,但这将是作弊,因为它不会影响对象本身的真值:
class MyObject
def !
true
end
end
也许我不太了解一些基本的东西,但我想知道在为 if
语句评估对象时是否调用了对象的某些特定方法?
所以,在下面...
my_object = MyObject.new
if !my_object
puts 'Hello, world!'
end
class MyObject
def ___
return false
end
end
...是否有一些方法 ___
可以在 if
调用的对象中定义,以便我可以确定条件的结果? (在上面,输出将是 'Hello, world!')
或者有没有其他方法可以根据 MyObject
的定义控制它在 if
语句中的计算方式?
谢谢。
如果变量不是 nil
或 false
,则 if
应该计算为真(如果变量未定义,将会出错)。我不确定是否有办法覆盖定义为 return nil 或 false 的对象(这不会让大多数 Ruby 程序员感到困惑)但我很想听听其他人的意见.
你可以做的是将一个方法添加到 return 一个 nil
或 false
值并改用它:
class MyObject
def foo?
false
end
end
obj = MyObject.new
if obj.foo?
puts "true"
else
puts "false"
end
更新:您可以将 new
方法重写为 return 布尔值,而不是对象。
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?
检查或其他。
is there some method
___
that I could define within the object that would called byif
, such that I can determine the result of the conditional?
不,不幸的是没有。不幸的是,这是 Ruby 不是面向对象的情况之一。
Ruby 中只有两个虚假对象:false
(很明显)和 nil
。其他一切都是真实的,包括在其他一些语言中被认为是虚假的对象,例如整数 0
、浮点数 0.0
、空字符串 ''
、空数组 []
和空散列 {}
.
面向对象的基本支柱之一是对象可以相互模拟。事实上,有些人认为这是 面向对象的定义特征。然而,无法在 Ruby.
中模拟false
或 nil
(in the above, the output would be 'Hello, world!')
在这种特殊情况下,您可以通过覆盖 !
来实现这一点,但这将是作弊,因为它不会影响对象本身的真值:
class MyObject
def !
true
end
end