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

これは可能ですか?

注:これはRailsではなくネイティブの Ruby である必要があります!

4

2 に答える 2

1

これを達成することはできません。

の戻り値s.nil?は または のいずれtrueかであり、それぞれおよびfalseの唯一のインスタンスです。2 つのクラスの他のインスタンスを作成することはできません。したがって、パッチを適用したり、コンテキストを覚えたりすることはできません。とでシングルトン メソッドを定義できますが、それは何も知らないため、別の述語をチェーンすることはできません。TrueClassFalseClassTrueClassFalseClasssortruefalsesempty?

def true.or other
  true
end

def false.or other
  other
end

s.nil?.or(s.empty?)twoヘルパーメソッドを定義して書くことができます。

trueもう 1 つの考えは、 orではなく、すべての述語 (blabla?) メソッドに対してカスタマイズされたオブジェクトを返すことですfalse。しかし、Ruby では と だけがnilfalseになりfalse、それ以外は true になります。カスタマイズされたオブジェクトのインスタンスは常に true になり、これらのすべての述語メソッドが壊れます。

于 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?は、falseおよびfalseが のインスタンスであり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 に答える