模块中的开放类



我知道我可以执行以下命令向String类添加方法

class String
  def do_something
    puts self.size
  end
end
var = "test"
var.do_something

返回4

我希望能够有一个模块的函数,在一个字符串,但能够调用do_something方法在这个字符串(见下面的例子)-这是可能的吗?

编辑:添加了不工作的示例代码

module TestModule
  class String
    def do_something
      puts self.size
    end
  end
  def self.test(str)    
    str.do_something
  end
end
undefined method 'do_something' for "hello":String (NoMethodError)

在编写代码时,您定义了一个名为TestModule::String的新类。如果你想修改内置的Ruby String类,你需要使用String的全限定名(带"::"),如果你想将声明保留在模块内。

module TestModule
  class ::String
    def do_something
      puts self.size
    end
  end
  def self.test(str)  
    str.do_something
  end
end

添加"::"告诉Ruby你想要的String类不是TestModule的一部分。

在同一个文件的TestModule外声明String可能更简洁。

如果你不想污染全局String类,你可以只修改你想要添加方法的特定String实例。

module TestModule
  def self.test(str)  
    do_somethingify!(str)
    str.do_something
  end
  def self.do_somethingify!(str)
    unless str.respond_to? :do_something
      str.instance_eval do
        def do_something
          puts size
        end
      end
    end
  end      
end          

也许是这个?

module TestModule
  module_function
  def test(str)
    str.instance_eval{doSomething}
  end
end
Test.test(str)

编辑由于问题的变化而更改

doSomething的定义放在TestModule类之外。

class String
  def doSomething
    puts size
  end
end
module TestModule
  module_function
  def test(str)  
    str.doSomething
  end
end

相关内容

  • 没有找到相关文章

最新更新