كيف يمكنك تجاوز المشغل روبي المساواة الحالة؟ (===)

StackOverflow https://stackoverflow.com/questions/629669

  •  08-07-2019
  •  | 
  •  

سؤال

ولدي الطبقة التي أريد مقارنة لكلا سلاسل والرموز في بيان الحالة، حتى ظننت أنني مجرد تجاوز أسلوب === () لصفي وجميع سيكون الذهب. ولكن لي طريقة === () لم يحصل دعا خلال بيان حالة. أي أفكار؟

وهنا بعض رمز المثال، وما يحدث في جلسة IRB:

class A
   def initialize(x)
      @x=x #note this isn't even required for this example
   end
   def ===(other)
      puts "in ==="
      return true
   end
end
<اقتباس فقرة>   

والاتحاد الدولي للرجبي (الرئيسي): 010: 0> ل= A.new ( "مرحبا")
  => #
  الاتحاد الدولي للرجبي (الرئيسي): 011: 0> الحالة
  الاتحاد الدولي للرجبي (الرئيسي): 012: 1> عندما "مرحبا" ثم 1
  الاتحاد الدولي للرجبي (الرئيسي): 013: 1> آخر 2
  الاتحاد الدولي للرجبي (الرئيسي): 014: 1> نهاية
  => 2

و(أنه لم يطبع الرسالة ويجب أن تعود دائما صحيحا على أي حال) لاحظ أنه مثالي أود أن تفعل

def ===(other)
          #puts "in ==="
          return @x.===(other)
end

وشكرا مقدما.

هل كانت مفيدة؟

المحلول

والتعبير بعد الكلمة 'حالة' هو الجانب الأيمن من التعبير ===، والتعبير بعد 'عندما' الكلمة على الجانب الأيسر من التعبير. لذلك، فإن الطريقة التي يتم استدعاء هو سلسلة. ===، وليس A. ===.

ونهج السريع إلى عكس المقارنة:

class Revcomp
    def initialize(obj)
        @obj = obj
    end

    def ===(other)
        other === @obj
    end

    def self.rev(obj)
        Revcomp.new(obj)
    end
end

class Test
    def ===(other)
        puts "here"
    end
end

t = Test.new

case t
when Revcomp.rev("abc")
    puts "there"
else
    puts "somewhere"
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top