2013-06-18 28 views
9

Tôi không hiểu, tại sao eval công trình như thế này:Ruby: eval với chuỗi suy

"123 #{456.to_s} 789" # => "123 456 789" 
eval('123 #{456.to_s} 789') # => 123 

Làm thế nào tôi có thể suy ra một chuỗi bên trong eval?

Cập nhật:

Cảm ơn bạn, bạn bè. Nó đã làm việc.

Vì vậy, nếu bạn có một biến chuỗi với #{} mà bạn muốn eval sau đó, bạn nên làm điều đó như được giải thích dưới đây:

string = '123 #{456} 789' 
eval("\"" + string + "\"") 
# => 123 456 789 

hoặc

string = '123 #{456} 789' 
eval('"' + string + '"') 
# => 123 456 789 
+1

Bạn có ý nghĩa gì với "thay thế vĩ mô"? – sawa

+0

@sawa, tôi có nghĩa là '# {}' phần, xin vui lòng, chỉnh sửa nó đúng cách, tôi chỉ không biết làm thế nào để nói nó trên tiếng Anh –

+1

Được rồi, có lẽ bạn có nghĩa là nội suy. – sawa

Trả lời

19

Điều gì đang xảy ra, eval có đang đánh giá chuỗi là mã nguồn không. Khi bạn sử dụng dấu ngoặc kép, chuỗi được nội suy

eval '"123 #{456.to_s} 789"' 
# => "123 456 789" 

Tuy nhiên khi bạn sử dụng dấu nháy đơn, không có suy, vì thế mà # bắt đầu bình luận, và bạn sẽ có được

123 #{456.to_s} 789 
# => 123 

Chuỗi suy xảy ra trước cuộc gọi eval vì đó là thông số của phương thức.

Cũng lưu ý rằng 456.to_s là không cần thiết, bạn chỉ có thể thực hiện #{456}.

+1

Việc thay thế các dấu ngoặc kép bằng dấu ngoặc kép cho một lỗi cú pháp vì 'eval (" 123 # {456.to_s} 789 ")' được đánh giá là '123 456 789' – Stefan

+0

nếu chuỗi có # {} và dấu ngoặc kép như sau: string = '12 # {45} 78 "9" 0 ' –

3

Bạn muốn:

eval('"123 #{456.to_s} 789"') 

. . . hy vọng bạn có thể thấy lý do tại sao?

Mã được chuyển đến trình thông dịch từ eval là chính xác như bạn đã viết (vào irb hoặc như một phần của tệp .rb), vì vậy nếu bạn muốn eval xuất ra giá trị chuỗi, chuỗi bạn đánh giá phải bao gồm các dấu ngoặc kép làm cho biểu thức bên trong nó là String.

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