实例函数 vs Class Ruby 中的函数
Instance Functions vs Class Functions in Ruby
我有一个简单程序的两个版本来完成同样的事情。我有一些问题。
- 我什么时候应该使用 class 函数而不是实例函数?
- 与实例函数相比,使用 class 是否有任何性能优势?在其他一切不变的情况下,一个人是否比另一个人使用更多的资源。
- 用 self 定义一个 class 函数与用模块名称定义它一样(版本 2 问题)
版本 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:class 函数
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!
欢迎任何反馈。我是 Whosebug 和 Ruby 的新手,因此也欢迎更正发帖风格或其他批评。
首先,Ruby 中的函数称为方法。
在版本 1 中,您使用带有实例方法的模块,它可以在混合中使用(即混合到 class 中),如上。在这里,您将它与 main.rb.
中的顶级对象 class 混合
在版本 2 中,您将模块与 class 方法一起使用,其中模块充当命名空间,以避免在与其他模块一起使用时这些方法发生命名空间冲突和 classes.
针对您的具体问题:
1。我什么时候应该使用 class 函数而不是实例函数?
Class 模块内的级别方法可以用于当你想提供对模块方法的直接访问而不需要实例化一个 class 对象(例如独立库)或者当你想在混入的对象范围内使用方法
当您想通过混入的 class 对象调用模块的方法时,应使用实例方法(例如,为 class 提供附加功能并提供机制class 类似于多重继承)
2。使用 class 与实例函数相比有什么性能优势吗?在其他一切不变的情况下,一个人是否比另一个人使用更多的资源。
如 1 和 3 中所述,收益取决于所需的用途。对于内存消耗,AFAIK,没有可数的差异。
3。使用 self 定义 class 函数与使用模块名称定义函数相同(版本 2 问题)
不完全是。当您使用模块名称定义模块方法时,它始终可以在模块范围内访问,而使用 self 定义的模块方法将在调用它的对象范围内访问。有关详细说明,请参阅以下答案:Trying to understand use of self.method_name vs. Classname.method_name in Ruby
希望这对您有所帮助,干杯。
我有一个简单程序的两个版本来完成同样的事情。我有一些问题。
- 我什么时候应该使用 class 函数而不是实例函数?
- 与实例函数相比,使用 class 是否有任何性能优势?在其他一切不变的情况下,一个人是否比另一个人使用更多的资源。
- 用 self 定义一个 class 函数与用模块名称定义它一样(版本 2 问题)
版本 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:class 函数
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!
欢迎任何反馈。我是 Whosebug 和 Ruby 的新手,因此也欢迎更正发帖风格或其他批评。
首先,Ruby 中的函数称为方法。
在版本 1 中,您使用带有实例方法的模块,它可以在混合中使用(即混合到 class 中),如上。在这里,您将它与 main.rb.
中的顶级对象 class 混合在版本 2 中,您将模块与 class 方法一起使用,其中模块充当命名空间,以避免在与其他模块一起使用时这些方法发生命名空间冲突和 classes.
针对您的具体问题:
1。我什么时候应该使用 class 函数而不是实例函数?
Class 模块内的级别方法可以用于当你想提供对模块方法的直接访问而不需要实例化一个 class 对象(例如独立库)或者当你想在混入的对象范围内使用方法
当您想通过混入的 class 对象调用模块的方法时,应使用实例方法(例如,为 class 提供附加功能并提供机制class 类似于多重继承)
2。使用 class 与实例函数相比有什么性能优势吗?在其他一切不变的情况下,一个人是否比另一个人使用更多的资源。
如 1 和 3 中所述,收益取决于所需的用途。对于内存消耗,AFAIK,没有可数的差异。
3。使用 self 定义 class 函数与使用模块名称定义函数相同(版本 2 问题)
不完全是。当您使用模块名称定义模块方法时,它始终可以在模块范围内访问,而使用 self 定义的模块方法将在调用它的对象范围内访问。有关详细说明,请参阅以下答案:Trying to understand use of self.method_name vs. Classname.method_name in Ruby
希望这对您有所帮助,干杯。