在Ruby中,如何从类的实例中调用类方法?说我有

class Truck
  def self.default_make
    # Class method.
    "mac"
  end

  def initialize
    # Instance method.
    Truck.default_make  # gets the default via the class's method.
    # But: I wish to avoid mentioning Truck. Seems I'm repeating myself.
  end
end

Truck.default_make行检索默认值。但有办法不提卡车吗?似乎应该有。


当前回答

类似于你的问题,你可以用:

class Truck
  def default_make
    # Do something
  end

  def initialize
    super
    self.default_make
  end
end

其他回答

类似于你的问题,你可以用:

class Truck
  def default_make
    # Do something
  end

  def initialize
    super
    self.default_make
  end
end

你做得对。类方法(类似于c++或Java中的“静态”方法)不是实例的一部分,因此必须直接引用它们。

关于这一点,在你的例子中,你最好将'default_make'设置为常规方法:

#!/usr/bin/ruby

class Truck
    def default_make
        # Class method.
        "mac"
    end

    def initialize
        # Instance method.
        puts default_make  # gets the default via the class's method.
    end
end

myTruck = Truck.new()

类方法对于使用该类的实用程序类型函数更有用。例如:

#!/usr/bin/ruby

class Truck
    attr_accessor :make

    def default_make
        # Class method.
        "mac"
    end

    def self.buildTrucks(make, count)
        truckArray = []

        (1..count).each do
            truckArray << Truck.new(make)
        end

        return truckArray
    end

    def initialize(make = nil)
        if( make == nil )
            @make = default_make()
        else
            @make = make
        end
    end
end

myTrucks = Truck.buildTrucks("Yotota", 4)

myTrucks.each do |truck|
    puts truck.make
end

在实例方法中,你可以直接调用self.class.whatever,而不是引用类的字面名称。

class Foo
    def self.some_class_method
        puts self
    end

    def some_instance_method
        self.class.some_class_method
    end
end

print "Class method: "
Foo.some_class_method

print "Instance method: "
Foo.new.some_instance_method

输出:

Class method: Foo
Instance method: Foo

一个:

class Truck
  def self.default_make
    "mac"
  end

  attr_reader :make

  private define_method :default_make, &method(:default_make)

  def initialize(make = default_make)
    @make = make
  end
end

puts Truck.new.make # => mac

要访问实例方法中的类方法,请执行以下操作:

self.class.default_make

这里有一个解决你的问题的替代方案:

class Truck

  attr_accessor :make, :year

  def self.default_make
    "Toyota"
  end

  def make
    @make || self.class.default_make
  end

  def initialize(make=nil, year=nil)
    self.year, self.make = year, make
  end
end

现在让我们使用我们的类:

t = Truck.new("Honda", 2000)
t.make
# => "Honda"
t.year
# => "2000"

t = Truck.new
t.make
# => "Toyota"
t.year
# => nil