هل يمكن لمشغلي الياقوت مستعارين؟
-
05-07-2019 - |
سؤال
أنا مهتم بكيفية ذهاب المرء في الحصول على هذا العمل:
me = "this is a string"
class << me
alias :old<< :<<
def <<(text)
old<<(text)
puts "appended #{text}"
end
end
أود ذلك عندما يتم إلحاق شيء ما me
متغير ، سيستخدم الكائن الطريقة المعاد تعريفها.
إذا حاولت تشغيل هذا ، أحصل على syntax error, unexpected ':', expecting kEND
في :<<
.
المحلول
:old<<
يشبه ":old
<<
". حاول فقط :old
, ، أو إذا كنت تريد حقًا ، :"old<<"
(ولكن استمتع بتسميته من خلال هذا الاسم).
نصائح أخرى
لا يُسمح سوى ببعض الشخصيات في حرفية الرمز. أنت تبحث عن:
alias :"old<<" :"<<"
كما أوضح الآخرون بالفعل ، فإن المشكلة ببساطة old<<
ليس معرف روبي قانوني. يمكنك ، مع الحيل ، إنشاء طريقة بهذا الاسم ، لكن لا يمكنك تسميتها بالطرق العادية ، وبالتأكيد لن يتم التعرف عليها كمشغل.
ومع ذلك ، فإن جميع الإجابات حتى الآن ، في حين أنها أجاب بالتأكيد على سؤالك ، تجاهلت تمامًا الأساسية المشكلة: لا ينبغي أن يكون لهذه الطريقة اسم في المقام الأول! وإذا لم يكن له اسم ، فإن مشكلة الاسم غير قانونية ببساطة لا تنشأ.
#!/usr/bin/env ruby
require 'test/unit'
require 'stringio'
class TestOperatorDecorator < Test::Unit::TestCase
def setup; @old_stdout, $> = $>, (@fake_stdout = StringIO.new) end
def teardown; $> = @old_stdout end
def test_that_me_dot_append_writes_to_stdio
me = 'this is a string'
class << me
old_method = instance_method :<<
define_method :<< do |text|
old_method.bind(self).(text)
puts "appended #{text}"
end
end
me << 'Test'
assert_equal "appended Test\n", @fake_stdout.string
end
end
في هذه الحالة ، لا يتم تسمية الطريقة أبدًا ، مما لا يعني فقط أنه لا يتعين علينا اختراع اسم لذلك ، فهذا يعني أيضًا أنه لا يلوث مساحة الاسم.
المشكلة مع :old<<
. يتم تفسيره على أنه :old <<
, ، أي رمز :old
تليها <<
المشغل ، لذلك هو خطأ في بناء الجملة. ربما يمكنك المحاولة :"old<<"
?
على الرغم من أنني أتفق مع thenduks و ephemient ، يمكنك الاسم المستعار للمشغل بهذه الطريقة ، ثم استخدام إرسال للاتصال بها ، يمكنك أيضًا استخدام ميراث الفصل. على سبيل المثال:
me = "is a string"
class << me
def <<(text)
super
puts "appended #{text}"
end
end
me << " bob"
puts me #=> is a string appended bob