2014-11-21 54 views
0
class Person 
    attr_reader = :name, :location 
    def initialize(name, location) 
    @name = name 
    @location = location 
    end 
end 

persons_array = [Person.new("Shon", "Texas"), Person.new("Michael", "California"), Person.new("Chris, "california") ] 

我想通過上面的排列顯示"Shon is in Texas." 我試圖persons_array.each { puts "#{@name} is in "#{location}"迭代,但沒有運氣。迭代通過排列顯示實例變量

+1

感謝大家提交的答案是不鼓勵SO,有充分的理由。首先,讀者浪費時間。 Socondly,你不想鼓勵可憐的答案。第三,如果有人提交了一個殺手鐗的答案,並且你說「好的答案!!」,他們會怎麼想?最後,如果你忘了感謝某人的回答,讀者可能會認爲你顯然不喜歡那一個。不要壞,許多新手都這樣做。有空時閱讀[this](http://stackoverflow.com/help)。 – 2014-11-21 20:11:16

+0

如果你沒有讀訪問者,你可以這樣寫:'[Person.new(「Luke」,「大麻煩」)] map {| obj | 「#{obj.instance_variable_get(:@ name)}在#{obj.instance_variable_get(:@ l​​ocation)}」} => [「Luke在大麻煩」]。 – 2014-11-21 20:24:49

回答

1

三個問題與您的代碼:

  • attr_reader行不應該有等號
  • 最後一行,在傳遞給each塊必須聲明管招牌的人變量(|
  • each塊,你必須調用namelocation存取的個人實例裏面,你不」無法訪問局部變量(例如:@name)。

下面是完整的代碼:

class Person 
    attr_reader :name, :location 
    def initialize(name, location) 
    @name = name 
    @location = location 
    end 
end 

persons_array = [ 
    Person.new("Shon", "Texas"), 
    Person.new("Michael", "California"), 
    Person.new("Chris", "california") 
] 

persons_array.each{ |p| puts "#{p.name} is in #{p.location}" } 

而這裏的工作原理是:http://ideone.com/rMgpPd

1

您有一些語法錯誤。

它應該是attr_reader :name而不是attr_reader = :name。實際上,attr_reader是一種可以接受任意數量參數的方法,您可以這樣調用它:attr_reader(:name, :location)它仍然可以工作。

你可以看看如何|variable|作品在Ruby塊這裏:What are those pipe symbols for in Ruby?

class Person 
    attr_reader :name, :location 
    def initialize(name, location) 
    @name = name 
    @location = location 
    end 
end 

persons_array = [Person.new("Shon", "Texas"), Person.new("Michael", "California")] 
persons_array.each do |person| 
    puts "#{person.name} is in #{person.location}" 
end 

將打印

Shon is in Texas 
Michael is in California