加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 在模块中打开类

发布时间:2020-12-17 03:58:58 所属栏目:百科 来源:网络整理
导读:我知道我可以执行以下操作来向String类添加方法 class String def do_something puts self.size endendvar = "test"var.do_something 这将返回4 我希望能够拥有一个带有String的函数的模块,但是能够在这个字符串上调用do_something方法(例如见下文) – 是否
我知道我可以执行以下操作来向String类添加方法

class String
  def do_something
    puts self.size
  end
end

var = "test"
var.do_something

这将返回4

我希望能够拥有一个带有String的函数的模块,但是能够在这个字符串上调用do_something方法(例如见下文) – 是否可能?

编辑:添加了无效的示例代码

module TestModule
  class String
    def do_something
      puts self.size
    end
  end

  def self.test(str)    
    str.do_something
  end
end

这给出了错误:未定义的方法’do_something’代表“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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读