كيف يمكنك تجاوز المشغل روبي المساواة الحالة؟ (===)
-
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