2009-07-13 33 views
2

我正在爲學校開發一個Ruby項目,並且很遺憾我的文獻中找不到這個問題的答案。Ruby - 調用數組中的對象

我有一批露營地,每個都包含一個客人。我初始化很多這樣的:

lots = Array.new 

for i in (1..36) 
    lots[i] = Lot.new(i) 
end 

再往下,我創建了一個Guest對象,對其進行初始化,現在我想將Guest添加到我的Lot。在類Lot的方法是這樣的:

def AddGuest(guest) 
    @guest = guest 
end 

問題是當我要調用該方法,因爲Lot處於Array

lots[lotnumber].AddGuest(guest) 

這個調用給我的錯誤:

undefined method `[email protected]' for #<Guest:0x2c1ff14> (NoMethodError) 

我已經使用要求,因此類彼此瞭解。我很難理解Ruby,可能我的錯誤是我嘗試訪問Array類中的AddGuest方法?我習慣於在C++中做這樣的事情。

以下是完整的源代碼(至少相關部分)。

整套Lot類:main.rb的的

class Lot 

    def initialize(number) 
    @gauge = rand(2000) + 2000 
    @number = number 
    @guest = false 
    end 

    def Occupied() 
    return @guest 
    end 

    def AddGuest(guest) 
    @guest = guest 
    end 

    def RemoveGuest() 
    @guest = false 
    end 

end 

零件

#includes 
require 'guest' 
require 'lot' 

#initiate comparison variables 
userInput = "0" 
numberOfGuests = 0 
foundLot = false 
guests = Array.new 
lots = Array.new 

#initialize lot list 
for i in (1..36) 
    lots[i] = Lot.new(i) 
end 

播放機輸入省略

#make sure lot is not taken 
while foundLot == false do 
    lotnumber = rand(35)+1 
    if lots[lotnumber].Occupied() == false then 
    foundLot = "true" 
    end 
end 
foundLot = false 

guest = Guest.new(firstName, lastName, adress, phone, arrival, lotnumber) 
guests.insert(numberOfGuests, guest) 
numberOfGuests++ 

lots[lotnumber].AddGuest(guest) #this is where error hits 

end 

end 

end 
+5

您可以發佈完整的源代碼?是在類的範圍中定義的AddGuest方法? – 2009-07-13 20:25:39

+0

是否有可能無意中將AddGuest置於私人或受保護的位置? – Ori 2009-07-13 20:46:59

+0

僅供參考,您可以更簡潔地創建這些地段,作爲`lots =(1..36).collect {| n | Lot.new n}`。 Ruby消除了大量顯式循環。 – Chuck 2009-07-13 21:50:27

回答

6

該錯誤似乎與您使用++運算符有關,這很自然地在C++中受到支持,但在Ruby中不受支持。

相對應的是:

numberOfGuests += 1 
0

通常紅寶石方法名稱不大寫。約定很簡單:ClassName,CONSTANT,method_name。

既然你有地塊對象數組,下面應該是真實的:

lots.class # => Array 
lots[1].class # => Lot 

調用的方法應爲地塊進行定義。

+0

對不起,如果我不清楚,所調用的方法是爲Lot定義的。當我在談論Array類時,我的意思是內置的,我沒有寫我自己的。 – Tobbe 2009-07-13 20:46:38

1

幾個小技巧......

[1]

一個寫這個稍微習慣的方法...

for i in (1..36) 
    lots[i] = Lot.new(i) 
end 

會...

(1..36).each { |i| lots[i] << Lot.new(i) } 

[2]

爲了從大量刪除客戶,你可能需要將其設置爲nil,而不是false。這將是我的建議...使用的

class Lot 

    def initialize(number) 
    @gauge = rand(2000) + 2000 
    @number = number 
    # Don't need to set @guest -- it's nil by default. 
    end 

    # In Ruby, methods that return a boolean often have a "?". 
    # Makes it "read better" when you call the method. (See 
    # usage sample.) 
    def occupied? 
    ! @guest.nil? 
    end 

    # There's a more commonplace way to do this. See below... 
    def add_guest(guest) 
    @guest = guest 
    end 

    def remove_guest() 
    @guest = nil 
    end 

end 

例子:

>> lot = Lot.new(2) 
=> #<Lot:0x1300920 @number=2, @gauge=3444> 
>> lot.occupied 
=> false 
>> lot.add_guest('A guest') 
=> "A guest" 
>> lot.occupied? 
=> true 
>> lot.remove_guest 
=> nil 
>> lot.occupied? 
=> false 

吃兩...

這是常規使用的類定義attr_accessor方法。他們會自動爲你的班級添加getter和setter方法。你能做到這一點,而不是add_guestremove_guest如果你想共同遵循的紅寶石圖案......

class Lot 

    attr_accessor :number, :gauge, :guest 

    def initialize(number) 
    @gauge = rand(2000) + 2000 
    @number = number 
    end 

    def occupied? 
    ! @guest.nil? 
    end 

end 

用法......

irb(main):017:0> lot = Lot.new(3) 
=> #<Lot:0xb7f7fca8 @gauge=3186, @number=3> 

設置了很多(如add_guest)的訪客。 ..

irb(main):019:0> lot.guest = 'A guest' 
=> "A guest" 
irb(main):020:0> lot.occupied? 
=> true 

獲取客戶進行了大量...

irb(main):025:0> lot.guest 
=> "A guest" 

刪除guest ...

irb(main):021:0> lot.guest = nil 
=> nil 
irb(main):023:0> lot.occupied? 
=> false