我有两个版本的简单程序可以完成同样的事情。我有一些问题。
版本1:实例函数
我有一个名为pastries.rb的文件,其中包含:
module Pastries
def description
return "I am a pastry!"
end
end
然后在另一个名为main.rb的文件中,我有:
require 'pastries'
include Pastries
puts "With include: #{description}" # With include: I am a pastry!
第2版:课程功能
pastries.rb:
module Pastries
# Are the following equivalent?
# def self.info
# return "I am a pastry!"
# end
def Pastries.description
return "I am a pastry!"
end
end
main.rb的:
require 'pastries'
puts "WITHOUT include: #{Pastries.description}" # WITHOUT include: I am a pastry!
感谢任何反馈。我是stackoverflow和Ruby的新手,所以也欢迎更正发布风格或其他批评。
答案 0 :(得分:-1)
首先,Ruby中的函数称为Methods。
在版本1中,您正在使用具有实例方法的模块,该方法可以在mixins中使用(即,它被混合到类中),如上所述。在这里,您将它与main.rb中的顶级对象类混合。
在版本2中,您正在使用具有类方法的模块,其中模块充当命名空间,以避免在与其他模块和类一起使用时这些方法的命名空间冲突。
针对您的具体问题:
当您希望提供对模块方法的直接访问而无需实例化类对象(例如,独立库)或希望在以下方法中使用该方法时,可以使用模块中的类级方法混合的对象的范围。
当您想要通过混合的类对象调用模块的方法时,应该使用实例方法(例如,为类提供附加功能并为类似于多个的类提供机制继承)
如1和3中所述,优点取决于所需的用途。对于内存消耗,AFAIK,没有可数差异。
不完全是。当您使用模块名称定义模块方法时,它始终可以在模块的范围内访问,而使用self定义的模块方法将在对象的范围内被访问。调用。有关详细说明,请参阅以下答案:Trying to understand use of self.method_name vs. Classname.method_name in Ruby
希望这有帮助,干杯。