【问题标题】:How to initialize class variable through class method in Ruby如何通过Ruby中的类方法初始化类变量
【发布时间】:2014-03-20 01:29:58
【问题描述】:

有没有一种简单的方法可以通过 Ruby 中的类方法来初始化类变量?我正在尝试这个:

class MyClass
    @@product_families = MyClass.load_pgrollups(File.join(File.dirname(__FILE__), ASSETS_FOLDER_NAME, PGROLLUP_CSV_FILENAME))

    def self.load_pgrollups(csv_file)                                                                                                                                        
       ....

       return product_families
    end

我遇到了一个异常:ModuleName::myClass:Class 的未定义方法 `load_pgrollups'

我不一定要初始化类变量。我还尝试通过模块函数初始化模块中的常量

module ModuleName
    PRODUCT_FAMILIES = load_pgrollups(File.join(File.dirname(__FILE__), ASSETS_FOLDER_NAME, PGROLLUP_CSV_FILENAME))

    def load_pgrollups(csv_file)                                                                                                                                        
       ....

       return product_families
    end

但我得到了MyModule:Module 的未定义方法`load_pgrollups'

【问题讨论】:

  • ruby 中的类名不以小写开头,其次你从哪里得到DataHandler??
  • DataHandler 应该变成 myClass 因为我试图用通用名称替换大多数名称。我正在编辑现有的 Ruby 代码。我之前没有任何Ruby经验,也不知道类名不能以小写字母开头。感谢您的评论。
  • @bjhaid,用您的 cmets 编辑了问题

标签: ruby-on-rails ruby


【解决方案1】:

定义后调用:

class myClass
  def self.load_pgrollups(csv_file)                                                                                                                                        
    ....
    return product_families
  end
  @@product_families = load_pgrollups(File.join(__dir__, ASSETS_FOLDER_NAME, PGROLLUP_CSV_FILENAME))
end

【讨论】:

    【解决方案2】:

    您在第 4 行定义了该方法,但您已经在第 2 行调用了它,而该方法尚未定义。所以,是的,该方法在您调用它时是未定义的。

    【讨论】:

    • 我认为这是错误的,因为每件事都是在运行之前编译的。所以没关系
    • @artmees:Ruby 中的代码,就像地球上几乎所有其他编程语言一样,从上到下运行。因此,调用方法的第 2 行在 定义方法的第 4 行之前运行。因此,由于在您调用该方法时,它还没有被定义,所以您会得到一个NoMethodError
    • 事实证明确实如此 - 请参阅 herehere。引用第一个 - “标准的 1.8.7 实现是用 C 语言编写的,作为单遍解释语言。”这令人惊讶,因为大多数现代编程语言并不关心关于方法是在第一次调用之前还是之后定义的,即 Python 总是与 Ruby 进行比较,但 Python 并不关心顺序。
    • JörgWMittag,您的回答也有效,谢谢。 @sawa 给出了一个代码示例,所以我将他的答案标记为已接受。
    猜你喜欢
    • 2013-09-21
    • 2017-10-23
    • 2022-10-15
    • 1970-01-01
    • 2017-11-30
    • 2020-07-26
    • 2017-02-23
    • 2022-01-13
    • 2011-06-21
    相关资源
    最近更新 更多