何时在实例方法上使用类方法是否合适?

时间:2013-10-30 17:05:20

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

所以.....?什么时候?

我在下面写了一个小例子,但它似乎不起作用,因为“马铃薯南瓜”没有显示。它正在回归:“你正在吃一种空白类型的食物”

class Food

        def initialize(food=“none”)
            @food = food
        end

        def self.food=(food=“none”)

        end

        def self.type?
            puts “you are eating a #{food} type of food” # defines the type of food you are eating.
        end
    end 

Food.new("potato squash")
Food.type?

高级人员。

3 个答案:

答案 0 :(得分:3)

你的方法都不应该是类方法。当您需要对存储在类实例中的数据进行操作时,将使用实例方法。当您需要操作与该类相关的数据时,将使用类方法。

例如(没有双关语):

class Food
  def initialize(food="none")
    @food = food
  end

  # operating on data that is stored in this instance
  def type?
    puts "you are eating a #{@food} type of food"
  end

  # operating on data pertaining to this class
  def self.types
    return ['Fruits', 'Grains', 'Vegetables', 'Protein', 'Dairy']
  end
end 

答案 1 :(得分:1)

    class Food
        attr_accessor :food
        def initialize(food="none")
            @food = food
        end

        def type?
            puts "you are eating a #{@food} type of food"
        end
    end

那么如何在它们之间做出选择?

我会问自己:@food,你的typeFood是什么type。看哪些更有意义。

只是偏离食物的例子:

实例方法适用于您想要从特定对象提出的问题。您不会向Person类询问其名称,但是对@person对象执行此操作。

另一方面,你问一个Person课程,比如,types_of_nationalities这可能会让你回归所有国籍。但你会问@person他的nationality是什么。

希望这可以解决一些问题。

答案 2 :(得分:0)

请尝试使用此代码,因为type?是一种实例方法。实例方法仅适用于Food类的实例(例如Food.new("potato squash")):

f = Food.new("potato squash")
f.type?