我有两个版本的简单程序来完成同样的事情。我有些问题要问。
版本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
endmain.rb:
require 'pastries'
puts "WITHOUT include: #{Pastries.description}" # WITHOUT include: I am a pastry!如有任何反馈,将不胜感激。我是一个新手,无论是在堆栈溢出和Ruby,所以纠正张贴风格或其他批评也是受欢迎的。
发布于 2015-07-14 00:02:51
首先,Ruby中的函数称为方法。
在版本1中,您使用的模块具有一个实例方法,该方法可以像上面那样在mixins中使用(即,它被混合到一个类中)。在这里,您将它与main.rb中的顶级对象类混合起来。
在第2版中,您正在使用modules class方法,其中模块充当名称空间,当与其他模块和类一起使用时,可以避免这些方法的名称空间冲突。
针对你的特殊问题:
1.什么时候应该使用类函数而不是实例函数?
当您想提供对模块方法的直接访问时,可以使用模块中的类级方法,而不需要实例化类对象(用于ex )。独立库),或者当您希望在对象的作用域中使用该方法时。
当您想要通过一个类对象调用模块的方法时,应该使用实例方法(对于ex )。为类提供附加功能,并为类似于多重继承的类提供机制)
2.使用类与实例函数是否有任何性能好处?考虑到所有其他常量,一种比另一种使用更多的资源。
正如在第1和第3节中所解释的,好处取决于所需的使用。对于内存消耗,AFAIK,没有可数的差异。
3.用self定义类函数与用模块名称定义类函数(版本2问题)相同
不完全同意。当您用模块的名称定义模块方法时,它总是可以在模块的作用域中访问,而使用self定义的模块方法将从调用它的对象的作用域中访问。有关详细说明,请参见以下答案:name in Ruby
希望这能帮上忙干杯。
https://stackoverflow.com/questions/31392339
复制相似问题