سؤال

أنا مهتم بكيفية ذهاب المرء في الحصول على هذا العمل:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top