Ruby on rails 在ruby(NoMethodError)中的模块内定义方法
我在学ruby,我发现了一些我不懂的东西。我知道ruby中的模块用于与:(or.)进行命名空间,并与include指令混合使用。 当我将一些方法分组到一个模块中,而不将它们放入一个类中时,问题就来了。 下面是一个例子:Ruby on rails 在ruby(NoMethodError)中的模块内定义方法,ruby-on-rails,ruby,methods,module,Ruby On Rails,Ruby,Methods,Module,我在学ruby,我发现了一些我不懂的东西。我知道ruby中的模块用于与:(or.)进行命名空间,并与include指令混合使用。 当我将一些方法分组到一个模块中,而不将它们放入一个类中时,问题就来了。 下面是一个例子: module Familiar #this will not work def ask_age return "How old are you?" end #this will work def Familiar::greeting
module Familiar
#this will not work
def ask_age
return "How old are you?"
end
#this will work
def Familiar::greeting
return "What's up?"
end
end
# this call returns **NoMethodError**
puts(Familiar::ask_age())
# this call works fine
puts(Familiar::greeting())
为什么我需要包含名称空间来定义方法,我已经在名称空间中了熟悉的为什么我必须重复我自己并放置熟悉的::问候语
您可以通过以下链接在线测试我的示例:在介绍文本中回答了这个问题
此表格:
module Familiar
def ask_age
return "How old are you?"
end
end
将#ask_age
定义为熟悉的数据库上的实例方法。但是,您无法实例化模块,因此无法直接访问它们的实例方法;你可以把它们混合到其他课程中。模块中的实例方法或多或少是无法直接访问的
相比之下,这种形式:
module Familiar
def self.ask_age
return "What's up?"
end
end
将
:ask_age
定义为一个模块函数。它是可直接调用的,当模块混合到另一个类中时,它不会出现在包含的类中。这意味着OP可以执行@emork=emork。new
,@emork。ask\u age
?@RichPeck否,无法实例化模块。但是这个模块可以包含在类中,这些模块的实例可以使用ask\u age
方法。因此,直接从模块调用方法的唯一方法是如果它是“类”方法,或者该方法在类中?您将如何从方法调用实例方法?@RichPeck,您的询问很难理解。您可以从任何地方向任何对象发送任何消息,因此也可以从任何地方调用任何对象的任何方法(前提是该对象选择响应您的消息)。在回答的第二部分中,您说,“defines::ask_age as a module function”,但示例显示了self.greeting。这是一个错误吗?