4

我正在尝试编写一个 Or 助手(基于Jay Fields 的 Not Method)。我想要实现的是:

s = ""
s.nil?             # false
s.empty?           # true
s.nil? || s.empty? # true
s.nil?.or.empty?   # should == true

我可以访问结果,nil?但不能访问输入的内容nil?

我得到:

NoMethodError: undefined method `empty?' for false:FalseClass

这甚至可能吗?

注意:这需要是原生 ruby​​ 而不是rails!

4

2 回答 2

1

你无法做到这一点。

的返回值s.nil?true或,它们分别是和false的唯一实例。您不能创建这两个类的其他实例。所以你不能猴子补丁或记住上下文。您可以在 上定义单例方法,但是,它一无所知,因此您不能链接另一个 predicate 。TrueClassFalseClassTrueClassFalseClasssortruefalsesempty?

def true.or other
  true
end

def false.or other
  other
end

s.nil?.or(s.empty?)您可以使用定义的两个辅助方法编写。

另一个想法是为所有谓词(blabla?)方法返回一个自定义对象,而不是trueor false。然而,在 ruby​​ 中,只有nilfalse产生假,任何其他的东西产生真。您自定义对象的实例将始终为真,这将破坏所有这些谓词方法。

于 2013-03-28T17:37:17.457 回答
0

试试这个

p RUBY_VERSION
p s = ""
p s.nil?             
p s.empty?           
p s.nil? || s.empty? 
p (s.nil? or s.empty?)

输出:

"2.0.0"
""
false
true
true
true

解释:

s.nil?
#=> false

s.nil?.or.empty?
#NoMethodError: undefined method `or' for false:FalseClass
#        from (irb):5
#        from C:/Ruby200/bin/irb:12:in `<main>'

上面的错误是因为s.nil?给了falseandfalse是 的一个实例FalseClass,并且这个类没有or任何方法。所以实际的修复如上所示。

编辑

p RUBY_VERSION
class Object

alias :oldnil :nil?

    def nil?
    @@x = self
    oldnil
    end
end

class FalseClass
    def or
    empty?
    end

    def empty?
    @@x.empty?
    end
end

class TrueClass
    def or
    empty?
    end

    def empty?
    @@x.empty?
    end
end

s = ""
p s.nil?
p s.empty?
p s.nil? || s.empty?
p s.nil?.or.empty?

输出:

"2.0.0"
false
true
true
true
于 2013-03-28T16:35:21.773 回答