Я пытаюсь получить доступ к методам класса в блоке define_singleton_method
, но он, похоже, не работает.Как получить доступ к методам класса в блоке define_singleton_method в Ruby
Вот пример.
class Test
attr_accessor :tags
def initialize
@tags = []
@tags.define_singleton_method(:<<) do |val|
val = tosymbol(val)
push(val)
end
end
def tosymbol(value)
value = value.to_s
value = value.gsub!(/\s+/,'_') || value
value = value.downcase! || value
return value.to_sym
end
end
Но когда я использую его, я получаю сообщение об ошибке.
test = Test.new
test.tags<<"Hello World"
NoMethodError: undefined method `tosymbol' for []:Array
from /home/joebloggs/GitHub/repo/file.rb:183:in `block in initialize'
from (irb):9
from /home/joebloggs/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
Я попытался изменить val = tosymbol(val)
к val = Test::tosymbol(val)
, но это не сработало, я получаю undefined method 'tosymbol' for Test:Class
Я мог бы переписать то, что tosymbol
делает, но это не будет очень DRY. Где я иду не так? Благодарю.
Попробуйте 'Def self.tosymbol', а затем вызвать' Test :: tosymbol (значение) '. Что вы на самом деле пытаетесь сделать? Возможно, мы можем предложить лучший способ. –
'def self.tosymbol' не работает, к сожалению. То, что я хочу сделать, - запустить метод проверки на то, что было перенесено на переменную экземпляра. На данный момент я пытаюсь сделать это, переопределив метод экземпляров '<<'. Проблема в том, что я хочу повторно использовать код, который у меня есть в другом месте, и 'define_singleton_method', кажется, не может ничего видеть вне себя. –