基本元编程:使用模块扩展现有类?

发布于 2024-12-02 05:37:24 字数 582 浏览 2 评论 0原文

我希望我的模块的一部分扩展 String 类。

这不起作用

module MyModule
  class String
    def exclaim
      self << "!!!!!"
    end
  end
end

include MyModule

string = "this is a string"
string.exclaim

#=> NoMethodError 

但这确实

module MyModule
  def exclaim
    self << "!!!!!"
  end
end

class String
  include MyModule
end

string = "this is a string"
string.exclaim

#=> "this is a string!!!!!"

我不希望 MyModule 的所有其他功能都被困在 String 中。再次将其纳入最高级别似乎很丑陋。当然有一种更简洁的方法可以做到这一点吗?

I'd like part of my module to extend the String class.

This doesn't work

module MyModule
  class String
    def exclaim
      self << "!!!!!"
    end
  end
end

include MyModule

string = "this is a string"
string.exclaim

#=> NoMethodError 

But this does

module MyModule
  def exclaim
    self << "!!!!!"
  end
end

class String
  include MyModule
end

string = "this is a string"
string.exclaim

#=> "this is a string!!!!!"

I don't want all the other functionality of MyModule to be marooned in String. Including it again at the highest level seems ugly. Surely there is a neater way of doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挖个坑埋了你 2024-12-09 05:37:24

第一个示例中的 exclaim 方法是在名为 MyModule::String 的类中定义的,该类与标准 String 类无关。

在模块内部,您可以打开标准 String 类(在全局命名空间中),如下所示:

module MyModule
  class ::String
    # ‘Multiple exclamation marks,’ he went on, shaking his head,
    # ‘are a sure sign of a diseased mind.’ — Terry Pratchett, “Eric”
    def exclaim
      self << "!!!!"
    end
  end
end

The exclaim method in your first example is being defined inside a class called MyModule::String, which has nothing to do with the standard String class.

Inside your module, you can open the standard String class (in the global namespace) like this:

module MyModule
  class ::String
    # ‘Multiple exclamation marks,’ he went on, shaking his head,
    # ‘are a sure sign of a diseased mind.’ — Terry Pratchett, “Eric”
    def exclaim
      self << "!!!!"
    end
  end
end
酷遇一生 2024-12-09 05:37:24

我不确定我是否理解了你的问题,但为什么不在文件中打开字符串,例如 exclaim.rb,然后在需要时需要它:

exclaim.rb

  class String
    def exclaim
      self << "!!!!!"
    end
  end

然后

require "exclaim"

"hello".exclaim

但也许我错过了一些东西?

I'm not sure I've understood your question but why don't open string in a file, say exclaim.rb, and then require it when you need it:

exclaim.rb

  class String
    def exclaim
      self << "!!!!!"
    end
  end

and then

require "exclaim"

"hello".exclaim

But maybe I'm missing something?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文