我创建了一个类,例如
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
答案 0 :(得分:6)
在Ruby中,变量之前的@@
表示它是一个类变量。您需要的是在变量之前创建实例变量的单@
。执行Result.new(..)
时,您正在创建类Result
的实例。
您不需要像这样创建默认值:
@@min = 0
@@max = 0
您可以使用initialize
方法
def initialize(min = 0, max = 0)
如果没有传入值,这会将min
和max
初始化为零。
现在,您的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