Ruby on rails 自我是假的还是零?
Ruby on rails 自我是假的还是零?,ruby-on-rails,ruby,Ruby On Rails,Ruby,self是否可以计算为false或nil 例如 class FooBar ... def check_this self && check_something_else end end 在这个条件中,self&&是必要的吗?实际上,它不能,因为——如果对象为nil或false——您不能对其调用方法,因为它不属于类。是的,但只有在一些非常奇怪的情况下: irb(main):001:0> def false.test irb(main):002:1&g
self
是否可以计算为false或nil
例如
class FooBar
...
def check_this
self && check_something_else
end
end
在这个条件中,self&&是必要的吗?实际上,它不能,因为——如果对象为nil或false——您不能对其调用方法,因为它不属于类。是的,但只有在一些非常奇怪的情况下:
irb(main):001:0> def false.test
irb(main):002:1> puts "hello" if !self
irb(main):003:1> end
=> nil
irb(main):004:0> false.test
hello
=> nil
对。记住Ruby中的所有东西都是一个对象,因此
self
对于false
和nil
是错误的:
nil.instance_eval { self } # => nil
false.instance_eval { self } # => false
这是阿维迪·格里姆关于这个主题的一篇文章,显然不可能使一个对象虚假,除非在非常奇怪的情况下,比如我想是追求
NilClass
或false
。不,self
在正常代码中不能为零或虚假
nil
和false
是带有方法的Ruby对象<代码>自我在以下情况中分别为零
和假
:
def nil.self
self
end
nil.self
=> nil
def false.self
self
end
false.self
=> false
这不完全是猴子补丁,它定义了单例方法,尽管我打赌这也不是你所想的正常情况。我不这么认为,
self&&
可能什么都不做,在我的书中总是真实的。不,在这个例子中不是。在Ruby中,布尔/条件表达式中只有nil
和false
计算为false。因为这里的self
指的是FooBar
的一个实例,所以它不能是nil
或false
。(请注意,这些分别是单例类NilClass
和FalseClass
)的实例。唯一的例外是如果您打开NilClass
的FalseClass
,我认为您没有这样做。@jformoff,意见没有帮助。如果您有一个论据支持您的断言,我们希望听到它。@AndrewSchwartz,如果我们在类FooBar…
?:-)之前有FooBar=NilClass
,该怎么办@CarySwoveland——啊,是的,鬼鬼祟祟的,我看到我还没有达到纯ruby ascension,我在思考类时就好像它们是Java类一样!不过,在这种情况下,您永远无法实例化新的FooBar
,因为NilClass
是单例的。而self
的计算结果总是nil
,因此示例条件仍然没有意义,只是出于另一个原因:-)具体来说,唯一错误的对象是false
和nil
。你说得对,我在JS/Python领域待得太久了。噢。JS。。。这是最奇怪的真理/谬误规则。说得好。因此,在打开NilClass和FalseClass时,自我可能是虚假的。然而,我认为在我上面的例子中,self
仍然不能计算为false。(虽然我想现在我要把这篇文章分成两个独立的问题)@abaldwin99:不行。只有false
和nil
可以为false,并且self
不可赋值。self
唯一可以为false的时间是在false
或nil
上的方法上下文中。通常是的,从技术上说是否。nil
(false
)是类NilClass
(FalseClass
)的唯一实例。@CarySwoveland。。。只要他不扩展这个类(不记得它在Ruby中被称为什么),NilClass和FalseClass就不会有他指定的方法。我明白你的意思。OP提出了两个问题#1:“自我评估是否为假?”(问题与标题相同)。正如其他答案所示,答案是“是”#2“此条件中的self&&是否必要?(例如)”。答案是“否”,因为这里的self
永远不可能是nil
或false
(假设常量FooBar
的计算结果不是NilClass
或false class
)<无论何时,只要接收者是false
(nil
),code>self就是false
)。@CarySwoveland:我假设你指的是类似false.instance_eval{put self}
,这是一种证明当接收者false
时,self
是false的断言的方法。我不久前给出了这个答案,但删除了它,认为(错误地)它与另一个答案相同。
class NilClass
def selfie
self
end
end
nil.selfie #=> nil
class FalseClass
def selfie
self
end
end
false.selfie #=> false