说我有:
class Cell
def initialize(x_var, y_var)
x = x_var
y = y_var
end
end
我如何能够访问对象单元格的变量?
cell1 = Cell.new(0, 0)
x = cell1.x
y = cell1.y
这是对的吗?
答案 0 :(得分:4)
您需要了解一些事项:
1-变量范围
class Cell
def initialize(x_var, y_var)
x = x_var
y = y_var
end
def print_x
puts x
end
end
Cell.new(1,1).print_x
您将获得以下内容:
NameError: undefined local variable or method `x' for #<Cell:0x007ff901d9f448>
在上面的代码中,变量x
在def initialize
和end
之间获得“生命”。这是x
的范围。如果您尝试访问该范围之外的x
,则会收到NameError
告知您未定义的内容。
2-现在,如果你想要一个与对象一样长的变量,你可以使用instance variables
。实例变量以@
开头,只要对象有效,就会生效。
class Cell
def initialize(x_var, y_var)
@x = x_var
@y = y_var
end
def x
return @x
end
def x=(val)
@x = val
end
def y
return @y
end
def y=(val)
@y = val
end
end
c = Cell.new(1,2)
puts c.x
给出以下内容:
1
=> nil
3-您必须在上面的示例中编写太多代码才能实现很少。这是@ aruprakshit的attr_reader
方便的地方:
attr_reader :x
生成方法:
def x
return @x
end
4-如果您想读写@x
,即同时生成x
和x=
方法,attr_accessor
会为您执行此操作:
class Cell
attr_accessor :x, :y
def initialize(x_var, y_var)
@x = x_var
@y = y_var
end
end
c = Cell.new(1,2)
puts c.x
c.x = 3
puts c.x
给出以下内容:
1
=> nil
=> 3
3
=> nil
答案 1 :(得分:2)
我如何能够访问对象单元格的变量?
您需要为此目的调查attr_reader
。
class Cell
attr_reader :x,:y
def initialize(x_var, y_var)
@x = x_var
@y = y_var
end
end
cell1 = Cell.new(0, 0)
cell1.x # => 0
cell1.y # => 0
请阅读此Why use Ruby's attr_accessor, attr_reader and attr_writer?
以了解 attr_reader 。