2014-02-16 100 views
0

說我有:紅寶石訪問對象的值

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 

這是正確的嗎?

回答

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

+0

你能向我解釋一下attr_reader:x,:y確實好嗎? – user3307307

+2

您的示例不起作用。你必須使用'attr_accessor'或'@'-variables。 – knut

+0

@knut OP正在使用'x = cell1.x',這只是說他需要'getter',而不是'setter'。看到問題 - *我將如何能夠訪問對象單元格的變量?*。 –

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 initializeend之間。這是x的範圍。如果您嘗試訪問該範圍之外的x,您會得到一個NameError,告訴您它沒有被定義。現在,如果你想要一個與物體一樣長的變量,你可以使用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,即同時生成xx=方法,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 
+0

很好的努力.. +1 –

+1

只需將'return @ x'寫爲'@ x',這裏就不需要了* return *關鍵字。 –

+0

是的......我知道'return'是可選的,但爲了清楚起見,在這個基本的例子中,我使用它:-) – Abdo