Ruby 不带运算符的直接访问模块方法(';';或';:&)

Ruby 不带运算符的直接访问模块方法(';';或';:&),ruby,methods,module,Ruby,Methods,Module,我试图构建一个可以包含在任何类中的模块,并直接调用其方法 红宝石就是一个很好的例子。例如,我可以在任何地方调用Colored模块中的方法,只需执行类似于put“我是蓝色!”.blue的操作,但这不是任何类。但我注意到它们调用了String.send(:include,Colored) 任何见解都值得赞赏 目标: module Example def do_something puts 'foo!' end end # Instead of calling Example::do

我试图构建一个可以包含在任何类中的模块,并直接调用其方法

红宝石就是一个很好的例子。例如,我可以在任何地方调用
Colored
模块中的方法,只需执行类似于
put“我是蓝色!”.blue
的操作,但这不是任何类。但我注意到它们调用了
String.send(:include,Colored)

任何见解都值得赞赏

目标:

module Example
  def do_something
    puts 'foo!'
  end
end

# Instead of calling Example::do_something or Example.do_something,
# I want to do this:
do_something # => 'foo!'
(不正确的方式)

module Example
  extend self 

  def do_something
    puts 'foo!'
  end
end

do_something # => undefined local variable or method `do_something' for main:Object (NameError)
(另一种不正确的方式)


试着像这样运行它

module Example
  def do_something
    puts 'foo!'
  end
end

include Example
do_something #=> foo!

试着像这样运行它

module Example
  def do_something
    puts 'foo!'
  end
end

include Example
do_something #=> foo!

试着像这样运行它

module Example
  def do_something
    puts 'foo!'
  end
end

include Example
do_something #=> foo!

试着像这样运行它

module Example
  def do_something
    puts 'foo!'
  end
end

include Example
do_something #=> foo!

您说您想定义一个可以“包含在任何类中”的模块,但在您的示例中,您根本没有将其包含在您试图调用它的地方。你真的是说“任何”类,还是你真的想让它以某种方式包含在每个类中?一般来说,您描述的不是ruby的工作方式,尽管有多种方法可以实现,这取决于您真正想做什么。@jrochkind这是一个令人困惑的问题,因为我很困惑,对不起!请参阅更新的问题。我一直在研究的一个例子是将彩色gem monkey补丁(在运行时添加)方法添加到字符串中。请注意,实际上您不能在“任何地方”调用它的方法,您必须在字符串类上调用它们:
“a String.blue”
某些字符串.blue
。不过,这种猴子式的修补通常被认为是个坏主意。但这仍然不是你想要的。如果您真的想定义一个可以在“任何地方”调用的方法,不要在模块中定义它,只需在任何模块或类之外的“顶层”上定义它即可。但是这是一个坏主意,除了不是彩色宝石所做的,这也是一个不好的想法。不清楚你所说的“那不是任何类别”是什么意思
blue
应用于
String
类的一个实例。明白了--
String
类被修改了。因此,它仍然“包含”在类中。谢谢你的帮助!您说您想定义一个可以“包含在任何类中”的模块,但在您的示例中,您根本没有将其包含在您试图调用它的地方。你真的是说“任何”类,还是你真的想让它以某种方式包含在每个类中?一般来说,您描述的不是ruby的工作方式,尽管有多种方法可以实现,这取决于您真正想做什么。@jrochkind这是一个令人困惑的问题,因为我很困惑,对不起!请参阅更新的问题。我一直在研究的一个例子是将彩色gem monkey补丁(在运行时添加)方法添加到字符串中。请注意,实际上您不能在“任何地方”调用它的方法,您必须在字符串类上调用它们:
“a String.blue”
某些字符串.blue
。不过,这种猴子式的修补通常被认为是个坏主意。但这仍然不是你想要的。如果您真的想定义一个可以在“任何地方”调用的方法,不要在模块中定义它,只需在任何模块或类之外的“顶层”上定义它即可。但是这是一个坏主意,除了不是彩色宝石所做的,这也是一个不好的想法。不清楚你所说的“那不是任何类别”是什么意思
blue
应用于
String
类的一个实例。明白了--
String
类被修改了。因此,它仍然“包含”在类中。谢谢你的帮助!您说您想定义一个可以“包含在任何类中”的模块,但在您的示例中,您根本没有将其包含在您试图调用它的地方。你真的是说“任何”类,还是你真的想让它以某种方式包含在每个类中?一般来说,您描述的不是ruby的工作方式,尽管有多种方法可以实现,这取决于您真正想做什么。@jrochkind这是一个令人困惑的问题,因为我很困惑,对不起!请参阅更新的问题。我一直在研究的一个例子是将彩色gem monkey补丁(在运行时添加)方法添加到字符串中。请注意,实际上您不能在“任何地方”调用它的方法,您必须在字符串类上调用它们:
“a String.blue”
某些字符串.blue
。不过,这种猴子式的修补通常被认为是个坏主意。但这仍然不是你想要的。如果您真的想定义一个可以在“任何地方”调用的方法,不要在模块中定义它,只需在任何模块或类之外的“顶层”上定义它即可。但是这是一个坏主意,除了不是彩色宝石所做的,这也是一个不好的想法。不清楚你所说的“那不是任何类别”是什么意思
blue
应用于
String
类的一个实例。明白了--
String
类被修改了。因此,它仍然“包含”在类中。谢谢你的帮助!您说您想定义一个可以“包含在任何类中”的模块,但在您的示例中,您根本没有将其包含在您试图调用它的地方。你真的是说“任何”类,还是你真的想让它以某种方式包含在每个类中?一般来说,您描述的不是ruby的工作方式,尽管有多种方法可以实现,这取决于您真正想做什么。@jrochkind这是一个令人困惑的问题,因为我很困惑,对不起!请参阅更新的问题。我一直在研究的一个例子是将彩色gem monkey补丁(在运行时添加)方法添加到字符串中。请注意,实际上您不能在“任何地方”调用它的方法,您必须在字符串类上调用它们:
“a String.blue”
某些字符串.blue
。不过,这种猴子式的修补通常被认为是个坏主意。但这仍然不是你想要的。如果你真的想定义一个可以在“任何地方”调用的方法