2009-03-20 21 views
10

. . . như trong ví dụ này:Tại sao tôi không thể nối hai chuỗi và gán chúng vào một biểu tượng?

helloworld.rb:1: syntax error, unexpected '=', expecting $end 
:helloworld = "hello ".concat("world") 

Tôi nghĩ nếu tôi sử dụng concat Tôi đang sửa đổi chuỗi "hello" và thêm "thế giới" để nó và sau đó cuối cùng gán chuỗi kết quả - "hello world" - đến: biểu tượng helloworld ở phía bên trái của dấu bằng. Tôi nghĩ rằng đó sẽ là hợp pháp, giống như tôi đã viết:

oh, đợi đã, điều đó cũng không có tác dụng. (đầu trầy xước).

Trả lời

12

Hãy thử điều này:

:"hello world" 
0

Vâng, vâng. Bạn không thể gán cho các biểu tượng. Ý bạn là:

foo = { :helloworld => "hello ".concat("world") } 

?

16

Ký hiệu Ruby không được gán giá trị cho chúng vì chúng đại diện cho giá trị chuẩn. Nếu bạn muốn xây dựng một biểu tượng từ một chuỗi, bạn có thể sử dụng "hello" .concat ("thế giới"). To_sym. Các biểu tượng

+0

Cảm ơn. Làm thế nào tôi sẽ tham khảo biểu tượng đó sau này? Tôi có phải luôn luôn nói: "hello" .concat ("thế giới"). To_sym –

+1

Có một vài tùy chọn khác. : "hello world" là trực tiếp nhất, nhưng nếu biểu tượng là không rõ cho đến khi chạy, bạn có thể lưu nó trong một var: foo = "hello" .concat ("thế giới"). to_sym. – dstnbrkr

+2

Bạn thậm chí có thể làm một cái gì đó như ':" # {"kế hoạch _"} # {: date} "' mà sẽ dẫn đến ': plan_date', hoặc bất cứ điều gì, tùy thuộc vào sự phức tạp của yêu cầu của bạn. – mydoghasworms

7

gây nhầm lẫn khi đến từ các ngôn ngữ không có bất kỳ thứ gì như chúng. Bạn không thể gán cho các biểu tượng, đó không phải là những gì họ cho.

Dưới đây là một vài ví dụ có thể giúp giải thích.

5.times do |i| 
    # a new string is created in each iteration of the loop 
    puts "my string".object_id 

    # there is only ever one symbol for each possible value 
    # so a new object is not created during each iteration 
    puts :my_symbol.object_id 

    # this often makes a difference when you're using them for things like hash keys 
    #some_method(:name => 'bob') 
    #some_method('name' => 'bob') 
end 

Sự khác biệt lớn khác là so sánh biểu tượng chỉ đơn giản là so sánh con trỏ.

2

Có lẽ những gì bạn đang thực sự tìm kiếm là một hằng số? Chúng có thể được tạo động, được đề cập đến sau và bạn sẽ nhận được cảnh báo nếu bạn cố gắng gán lại.

>> HELLO_WORLD = "hello ".concat("world") 
=> "hello world" 
>> HELLO_WORLD = "foo" 
(irb):3: warning: already initialized constant HELLO_WORLD 
=> "foo" 
1

Bạn không thể gán cho một biểu tượng nhưng bạn có thể trở thành biểu tượng mà là một nối các biểu tượng khác, mặc dù bạn phải đi qua chuỗi như xa như tôi biết (Tôi muốn biết nếu có một cách tốt hơn).

Giả sử bạn muốn lấy biểu tượng :myway bắt đầu từ các ký hiệu :my:way;

(:my.to_s + :way.to_s).to_sym # return :myway 
0
class Symbol 
    def + (to) 
    return "#{self}#{to}".to_sym 
    end 
end 
+2

Câu hỏi được hỏi cụ thể về giải thích tại sao người hỏi đang cố gắng không hoạt động. – Cezar

0

này làm việc cho tôi

@foo = 'world' 
"hello #{@foo}".to_s.to_sym 

output =>: "hello world"

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