在Ruby中初始化类对象变量

问题描述 投票:2回答:2

我创建了一个类例如

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

ruby
2个回答
5
投票

在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
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.