Ruby中的实例函数与类函数

Ruby中的实例函数与类函数,ruby,include,require,Ruby,Include,Require,我有两个版本的简单程序,可以完成相同的事情。我有一些问题 什么时候应该使用类函数而不是实例函数 使用类与实例函数有什么性能优势吗?在其他条件不变的情况下,一个比另一个使用更多的资源吗 使用self定义类函数是否与使用模块名称定义类函数相同(版本2问题) 第1版:实例函数 我有一个名为pastries.rb的文件,其中包含: module Pastries def description return "I am a pastry!" end end 然后在另一个名为main.r

我有两个版本的简单程序,可以完成相同的事情。我有一些问题

  • 什么时候应该使用类函数而不是实例函数
  • 使用类与实例函数有什么性能优势吗?在其他条件不变的情况下,一个比另一个使用更多的资源吗
  • 使用self定义类函数是否与使用模块名称定义类函数相同(版本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版:类函数

    Pasteries.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都是新手,因此也欢迎更正帖子风格或其他评论。

    首先,Ruby中的函数称为方法

    在版本1中,您将模块与一个实例方法一起使用,该方法可以在mixin中使用(即,它被混合到一个类中),如上所述。在这里,您将它与main.rb中的顶级对象类混合使用

    在版本2中,您将模块与类方法一起使用,其中模块充当名称空间,以避免与其他模块和类一起使用时这些方法的名称空间冲突

    关于你的具体问题:

    1.什么时候应该使用类函数而不是实例函数? 当您希望提供对模块方法的直接访问而无需实例化类对象(例如,独立库)时,或者当您希望在对象的范围内使用该方法时,可以使用模块内的类级方法

    当您希望通过一个类对象调用模块的方法(例如,为类提供附加功能,为类提供类似于多重继承的机制)时,应该使用实例方法

    2.使用类与实例函数有什么性能优势吗?在其他条件不变的情况下,一个比另一个使用更多的资源吗。 如1和3所述,好处取决于所需的使用。对于内存消耗,AFAIK,没有可计数的差异

    3.使用self定义类函数是否与使用模块名称定义类函数相同(版本2问题) 不完全是。使用模块名称定义模块方法时,它将始终在模块范围内可访问,而使用self定义的模块方法将在调用它的对象范围内可访问。有关详细说明,请参见以下答案:


    希望这有帮助,干杯。

    首先,Ruby中的函数称为方法

    在版本1中,您将模块与一个实例方法一起使用,该方法可以在mixin中使用(即,它被混合到一个类中),如上所述。在这里,您将它与main.rb中的顶级对象类混合使用

    在版本2中,您将模块与类方法一起使用,其中模块充当名称空间,以避免与其他模块和类一起使用时这些方法的名称空间冲突

    关于你的具体问题:

    1.什么时候应该使用类函数而不是实例函数? 当您希望提供对模块方法的直接访问而无需实例化类对象(例如,独立库)时,或者当您希望在对象的范围内使用该方法时,可以使用模块内的类级方法

    当您希望通过一个类对象调用模块的方法(例如,为类提供附加功能,为类提供类似于多重继承的机制)时,应该使用实例方法

    2.使用类与实例函数有什么性能优势吗?在其他条件不变的情况下,一个比另一个使用更多的资源吗。 如1和3所述,好处取决于所需的使用。对于内存消耗,AFAIK,没有可计数的差异

    3.使用self定义类函数是否与使用模块名称定义类函数相同(版本2问题) 不完全是。使用模块名称定义模块方法时,它将始终在模块范围内可访问,而使用self定义的模块方法将在调用它的对象范围内可访问。有关详细说明,请参见以下答案:


    希望这有帮助,干杯。

    该示例两次显示一个模块。首先将其用作mixin,然后将其用作命名空间。我想这就是模块的用例。决策首先取决于您希望如何使用模块。关于问题2和3的任何反馈?2-我不知道,性能/占地面积也取决于您的环境(MRI/Jruby/etc);3-相同,但重命名模块后,
    self
    也可以工作。示例显示了一个模块两次。首先将其用作mixin,然后将其用作命名空间。我想这就是模块的用例。决策首先取决于您希望如何使用模块。关于问题2和3的任何反馈?2-我不知道,性能/占地面积也取决于您的环境(MRI/Jruby/etc);3-相同,但重命名模块后,
    self
    也可以工作。我猜您的第三个解释不正确。我在链接资源下找不到关于您提到的范围的参考。你能提供一个具体的例子吗?谢谢,这澄清了它。我想你的第三个解释是不正确的。我在链接资源下找不到关于您提到的范围的参考。你能提供一个具体的例子吗?谢谢,这澄清了它。