Ruby on rails Ruby中未定义的类方法(在方法定义之前调用)

Ruby on rails Ruby中未定义的类方法(在方法定义之前调用),ruby-on-rails,ruby,mongoid,class-method,bit-fields,Ruby On Rails,Ruby,Mongoid,Class Method,Bit Fields,我最后犯了一个非常奇怪的错误: 当我运行此代码时: class HomeFeature include Mongoid::Document include Mongoid::Timestamps include Mongoid::Bitfield belongs_to :home def self.amenities %w(lobby jacuzzi sauna cinema games roof_garden events_room

我最后犯了一个非常奇怪的错误:

当我运行此代码时:

class HomeFeature
    include Mongoid::Document
    include Mongoid::Timestamps
    include Mongoid::Bitfield

    belongs_to :home

    def self.amenities
        %w(lobby jacuzzi sauna cinema games roof_garden events_room tennis_court visits_space roaster green_areas cistern)
    end

    bitfield :amenities, *HomeFeature.amenities.map(&:to_sym)
end
它工作得非常好,但是:

class HomeFeature
    include Mongoid::Document
    include Mongoid::Timestamps
    include Mongoid::Bitfield

    belongs_to :home

    bitfield :amenities, *HomeFeature.amenities.map(&:to_sym)

    def self.amenities
        %w(lobby jacuzzi sauna cinema games roof_garden events_room tennis_court visits_space roaster green_areas cistern)
    end
end
给我一个错误: ```NoMethodError:HomeFeature:Class的未定义方法“便利设施”````


有人能解释一下为什么会这样吗?非常感谢

在第二个示例中,您试图在定义类方法之前调用它(在
*HomeFeature.commercies.map(&:to_sym)
行调用,但仅在以后定义)。源代码的顺序在这里很重要,因为代码是从上到下解析的。

在第二个示例中,您试图在定义类方法之前调用它(它在
*HomeFeature.proficilities.map(&:to_sym)
,但只在后面定义)。源代码的顺序在这里很重要,因为代码是从上到下解析的。

答案实际上已经在您的问题标题中。是的,但为什么?这不是Ruby的工作原理,不是吗?它不像CNo,也不像“C”,但这并不意味着顺序不重要。可以这样想:当您定义一个类时,Ruby解释器逐行读取该类,并在该类的上下文中计算代码。当遇到方法定义时,它定义了方法,但实际上并不运行任何东西。顺序很重要。这通常不是实例方法的问题,您可以编写一个实例方法来调用在类中“较低”位置定义的另一个实例方法,原因是这些方法通常不会在定义的同时被调用。当您编写这样的实例方法时,解释器逐行读取类,运行类方法并定义新方法。然后,只有在定义了整个类之后,才会从该类实例化对象。在这一点上,方法已经被定义,方法可以很好地相互调用。答案实际上已经在你的问题标题中。是的,但是为什么?这不是Ruby的工作原理,不是吗?它不像CNo,也不像“C”,但这并不意味着顺序不重要。可以这样想:当您定义一个类时,Ruby解释器逐行读取该类,并在该类的上下文中计算代码。当遇到方法定义时,它定义了方法,但实际上并不运行任何东西。顺序很重要。这通常不是实例方法的问题,您可以编写一个实例方法来调用在类中“较低”位置定义的另一个实例方法,原因是这些方法通常不会在定义的同时被调用。当您编写这样的实例方法时,解释器逐行读取类,运行类方法并定义新方法。然后,只有在定义了整个类之后,才会从该类实例化对象。此时,已经定义了方法,并且方法可以很好地相互调用。