在Ruby中初始化类对象变量

时间:2016-09-26 02:56:19

标签: ruby

我创建了一个类,例如

class Result
    @@min = 0
    @@max = 0
    def initialize(min, max)
        @@max.min = min
        @@max.max = max
    end
end

result = Result.new(1, 10)
result.max

与其他郎相同。像php,C#等我创建了一个类并传递了一个值,因为它有初始化方法,它现在应该包含对象值但是当我尝试打印时

puts result.min
puts result.max

它表示未定义的方法min

2 个答案:

答案 0 :(得分:6)

在Ruby中,变量之前的@@表示它是一个类变量。您需要的是在变量之前创建实例变量的单@。执行Result.new(..)时,您正在创建类Result的实例。

您不需要像这样创建默认值:

@@min = 0
@@max = 0

您可以使用initialize方法

执行此操作
def initialize(min = 0, max = 0)

如果没有传入值,这会将minmax初始化为零。

现在,您的initialize方法应该像

一样
def initialize(min=0, max=0)
    @min = min
    @max = max
end

现在,如果您希望能够在类的实例上调用.min.max方法,则需要创建这些方法(称为setter和getter)

def min # getter method
  @min
end

def min=(val) # setter method
  @min = val
end

现在,你可以这样做:

result.min     #=> 1
result.min = 5 #=> 5

Ruby有这些setter和getter的快捷方式:

  • attr_accessor:创建setter和getter方法。
  • attr_reader:创建getter方法。
  • attr_writer:创建setter方法。

要使用它们,您只需要执行attr_accessor :min。这将为min创建两种方法,因此您可以通过实例对象直接调用和设置最小值。

现在,您的代码应该如下所示

class Result
    attr_accessor :min, :max
    def initialize(min=0, max=0)
        @min = min
        @max = max
    end
end

result = Result.new(1, 10)
result.max #=> 10

答案 1 :(得分:1)

在不知道上下文的情况下,很难确切地说出你想要做什么。我怀疑你真正想要的是一个实例变量。在这种情况下你会这样做:

class Result
  attr_accessor :min, :max

  def initialize(min, max)
    @max = min

    @max = max
  end
end
除非你真的需要,否则最好避免使用Ruby中的类变量。如果你真的这样做,你可以这样做:

class Result
  @@min = 0

  @@max = 0

  def self.min
    @@min
  end

  def self.min=(new_min)
    @@min = new_min
  end

  def self.max
    @@max
  end

  def self.max=(new_max)
   @@max = new_max
  end

  def initialize(min, max)
    @@min = min

    @@max = max
  end

  def min
    @@min
  end

  def max
    @@max
  end
end

puts Result.min

puts Result.max

result = Result.new(1, 10)

puts result.min

puts result.max

puts Result.min

puts Result.max

但请注意,class variables are tricky