自我可能是假的还是零的?

时间:2016-05-12 19:46:32

标签: ruby-on-rails ruby

self可以评估为false还是nil?

例如......

class FooBar

  ...

  def check_this
    self && check_something_else
  end
end

此条件中的self &&是否必要?

6 个答案:

答案 0 :(得分:10)

是。请记住,Ruby中的所有内容都是一个对象,因此selffalsenil来说是假的:

nil.instance_eval { self }  # => nil
false.instance_eval { self }  # => false

答案 1 :(得分:5)

是的,但只是在一些非常奇怪的情况下:

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

答案 2 :(得分:3)

不,self在普通代码中不能为零或为假。

nilfalse是带有方法的Ruby对象。 self分别为nilfalse

def nil.self
  self
end
nil.self
=> nil

def false.self
  self
end
false.self
=> false

这不完全是猴子修补,它是定义单例方法,但我敢打赌,这不是你想到的正常情况。

答案 3 :(得分:2)

这是Avdi Grimm关于这个主题的relevant article,显然除非在非常奇怪的情况下,例如追求NilClassfalse,否则不可能使对象变得虚伪。

答案 4 :(得分:1)

class NilClass
  def selfie
    self
  end
end

nil.selfie #=> nil

class FalseClass
  def selfie
    self
  end
end

false.selfie #=> false

答案 5 :(得分:-1)

实际上,它不可能因为 - 如果一个对象是零或假 - 你不能在它上面调用一个方法,因为它不属于该类。