Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中的define_singleton_method块中访问类方法_Ruby - Fatal编程技术网

如何在Ruby中的define_singleton_method块中访问类方法

如何在Ruby中的define_singleton_method块中访问类方法,ruby,Ruby,我试图访问define\u singleton\u方法块中的类方法,但它似乎不起作用 这里有一个例子 class Test attr_accessor :tags def initialize @tags = [] @tags.define_singleton_method(:<<) do |val| val = tosymbol(val) push(val) end end def tosymbol(value)

我试图访问
define\u singleton\u方法
块中的类方法,但它似乎不起作用

这里有一个例子

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
类测试
属性存取器:标记
def初始化
@标签=[]
@标记。定义单例方法(:
我哪里做错了

您正在(re)定义一个

我哪里做错了


您正在(re)定义一个
尝试
def self.tosymbol
,然后调用
Test::tosymbol(val)
。你到底想做什么?也许我们可以建议一个更好的方法。
def self.tosymbol
不幸没有起作用。我想做的是对推送到实例变量的任何对象运行一个验证方法。目前我正试图通过重写实例
Try
def self.tosymbol
,然后ll
Test::tosymbol(val)
。你到底想做什么?也许我们可以建议一个更好的方法。
def self.tosymbol
很遗憾没有起作用。我想做的是对推送到实例变量的任何对象运行一个验证方法。目前我正试图通过重写实例来实现这一点
对不起,但这对我来说不起作用
@I_do_python抱歉,我编辑了答案,应该是
test Ok,现在可以了,谢谢。不过,有没有办法让这个特定于一个实例变量呢?因为这可能意味着类中只能有一个数组实例变量。用户也不清楚您的附加到tags变量的是什么(也就是说,
test@i\u-do\u-python的结果是肯定的,让我编辑答案,让你尝试一下。对不起,这对我不起作用。
@i\u-do\u-python抱歉,我编辑了答案,应该是
test-Ok,现在可以了,谢谢。不过,有没有办法让这个特定于一个实例变量呢?我想必会这样做。)在类中只能有一个数组实例变量。用户也不清楚您的附加到tags变量(即,
test@i_do_python的结果)是否正确。当然,让我编辑答案,以确保您可以尝试工作
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>'
def initialize
  @tags = []
end

def <<(val)
  tags << tosymbol(val)
end

test = Test.new
test << "Hello World"
#=> [:hello_world]
def initialize
  @tags = []
  test = self # <============
  @tags.define_singleton_method(:<<) do |val|
    val = test.tosymbol(val)
    push(val)
  end
end
test.tags << 'Hello World'
#=> [:hello_world]