2013-05-07 29 views
22

có cách nào để tạo biến trong Ruby với tên động không?Tên biến động động Ruby

Tôi đang đọc một tệp và khi tôi tìm thấy một chuỗi, hãy tạo một băm.

ví dụ:

file = File.new("games.log", "r") 

file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     Game_# = Hash.new 
    end 
    end 
end 

Làm thế nào tôi có thể thay đổi # trong Game_ # để số (Game_1, Game_2, ...)

+0

Các số này đến từ đâu? – sawa

+0

Một tên biến với một chữ cái vốn được coi là thực hành xấu trong Ruby trừ khi bạn đang khai báo một tên lớp hoặc mô-đun. Cân nhắc thay đổi 'Game_' thành' game_'. –

+1

Bạn sẽ * làm gì * với những tên được tạo động này? Mã nguồn của bạn không thể tham chiếu đến chúng ngoại trừ thông qua 'send's. Trông giống như một mảng với tôi. –

Trả lời

32

Bạn có thể làm điều đó với biến Ví dụ như

i = 0 
file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     instance_variable_set("@Game_#{i += 1}", Hash.new) 
    end 
    end 
end 

nhưng bạn nên sử dụng một mảng như viraptor nói. Vì bạn dường như chỉ có một hash mới như giá trị, nó có thể chỉ đơn giản là

i = 0 
file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     i += 1 
    end 
    end 
end 
Games = Array.new(i){{}} 
Games[0] # => {} 
Games[1] # => {} 
... 
+1

Cảm ơn bạn rất nhiều @sawa! –

+1

rất thú vị. – sidney

+0

Thông tin thêm: http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get –

8

Tại sao sử dụng các biến riêng biệt? Có vẻ như bạn chỉ muốn Game là danh sách có các giá trị được thêm vào nó mỗi lần. Sau đó, bạn có thể tham khảo chúng với Game[0], Game[1] ...

0

Nếu bạn thực sự muốn tên biến động, có thể là bạn có thể sử dụng một Hash, hơn bạn có thể thiết lập các động chủ chốt

file = File.new("games.log", "r") 
lines = {} 
i = 0 

file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     lines[:"Game_#{i}"] = Hash.new 
     i = i + 1 
    end 
    end 
end