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