2010-03-27 55 views
18

Tôi chỉ mới bắt đầu học Ruby và tôi đã viết một chương trình tạo ra một số số và gán chúng cho biến @one, @two, @three v.v. Sau đó, người dùng có thể chỉ định một biến để thay đổi bằng cách nhập tên của nó (ví dụ: một). Sau đó tôi cần phải làm một cái gì đó như '@ [valueofinout] = asd'. Làm thế nào tôi sẽ làm điều này, và có cách nào tốt hơn như cách tôi đang nghĩ đến dường như không được khuyến khích? Tôi đã tìm thấySử dụng giá trị của một biến như một tên biến khác trong Ruby

x = "myvar" 
myvar = "hi" 
eval(x) -> "hi" 

nhưng tôi không hiểu tại sao dòng thứ hai là cần thiết. Trong trường hợp của tôi, tôi sẽ sử dụng một cái gì đó giống như

@one = "21" 
input = "one" 
input = "@" + input 
changeto = "22" 
eval(input) -> changeto 

Trả lời

28

Sử dụng instance_variable_set (rubydoc)

instance_variable_set("@" + varname, value) 

Trong hầu hết các trường hợp mặc dù, bạn nên tách biến của Ruby bình thường của bạn từ các biến sử dụng của bạn được tương tác với. Cách tạo Hash của biến người dùng, ví dụ:

@uservars = { 'one' => 1, 'two' => 2 } 
two = @uservars['two'] # Look up 'two' variable 

varname = "myvar" 
@uservars[varname] = 5 # Set a variable by name 
value = @uservars[varname] # Get a variable by name 
+1

wow, đây thực sự là một lĩnh vực mà PHP vượt trội hơn về tính sạch sẽ của cú pháp. http://stackoverflow.com/a/4169891/2951835 – ahnbizcad

+0

Ruby làm cho nó khó làm vì nó xấu xí, bạn hiếm khi cần thiết lập biến người dùng được chỉ định của một cá thể trừ khi bạn đang lập trình meta. Tự động rối tung với các biến toàn cầu là một lỗ hổng bảo mật; nếu bạn muốn một tập hợp các biến do người dùng định nghĩa thì bạn có thể muốn có một băm. – rjh

2

biến Instance có thể được truy xuất thông qua phương pháp này:

input = instance_variable_get("@one") 

Sau này, trong trường hợp của bạn, bạn sẽ phải input bằng "21".

+0

Xin chào, tôi không chắc liệu điều đó có hiệu quả với những gì tôi cần hay không. Tôi cần phải có một cái gì đó mà sẽ gán một số nhất định cho một biến (nói biến A) nhưng tên của biến A không được biết đến. Tên của biến A được lưu trữ trong biến B mặc dù vậy tôi sẽ cần phải sử dụng giá trị của biến B để gán một cái gì đó cho biến A. AFAICT này không thể được thực hiện với instance_variable_get. – hrickards

+0

@hrickards: Bạn có biết giá trị sở hữu của A không? nếu bạn làm theo cách khác. Nhưng intance_variable_get nên làm những gì bạn muốn! –

+0

@Niklaos Một số nguyên giữa và bao gồm 1 và 49 – hrickards

Các vấn đề liên quan