Переопределение операторов массива переменных экземпляра в Ruby и области видимости - PullRequest
1 голос
/ 22 июля 2010

У меня есть тестовый класс и класс box, в тестовом классе у меня есть переменная с именем boxHolder, которая является массивом, я хочу переопределить метод << для этого массива. В синглтоне, как я могу получить доступ к moski_call? </p>

class Test
  attr_accessor :boxHolder

  def initialize()
   super
   self.boxHolder = Array.new

   class << @boxHolder
     def <<(box)
       box.setPositionWithinColumn(moski_call)
       super(box)
     end
   end
  end   

  def moski_call
    "YAAAAAAAAAAAAAAAAAAAA"
  end
end

class Box
  def initialize
  end

  def setPositionWithinColumn(str)
    puts "got a string #{str}"
  end
end

# test
box = Box.new
test = Test.new
test.boxHolder 

Ответы [ 3 ]

0 голосов
/ 22 июля 2010

как это:

# need this or else `moski_call` method is looked up in context of @boxholder
moski_call_output = moski_call

class << @boxholder; self; end.send(:define_method, :<<) { |box| 
     box.setPositionWithinColumn(moski_call_output)
     super(box)
}
0 голосов
/ 22 июля 2010

Вам необходимо сохранить доступ к «родительскому» объекту Test.Это можно сделать, используя тот факт, что блоки являются замыканиями:

parent = self # to be accessible in the closure

@boxHolder.define_singleton_method(:<<) do |box|
  box.setPositionWithinColumn(parent.moski_call)
  super(box)
end

Примечание : define_singleton_method является новым в Ruby 1.9, так что либо обновите, require 'backports/1.9.1/kernel/define_singleton_method', либо сделайте class << @boxHolder; define_method(:<<){ "..." } endпри использовании более старого Ruby.

0 голосов
/ 22 июля 2010

Как насчет:

def self.boxHolder.<< (box)
   box.setPositionWithinColumn(moski_call)
   super(box)
end     

Это объявит метод для вашего экземпляра boxHolder.Но boxHolder не имеет доступа к методу moski_call

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...