2013-04-22 13 views
8

Sự khác biệt trong cách Ruby khởi tạo một chuỗi mới với dấu ngoặc kép ("") so với String.new? Đối với mục đích tò mò và thử nghiệm, tôi gạt String#initialize:Ruby đánh giá các dấu ngoặc kép (hay còn gọi là "") so với String.new như thế nào?

class String 
    def initialize 
    puts "I <3 bananas" # they're delicious! 
    end 
end 

Những gì tôi đang cố gắng tìm ra là: tại sao là hai ví dụ này khác nhau?

# Calling the String class directly, I can declare banana love! 
irb(main):054:0> String.new 
I <3 bananas 
=> "" 

# Using double quotes, this string is not as tasty :(
irb(main):055:0> "" 
=> "" 

Điều này gây khó chịu cho nghiên cứu vì mọi kết quả của Google dường như tập trung vào cú pháp cơ bản của Ruby và tôi không thể tìm thấy bất kỳ điều gì trong tài liệu Ruby.

+1

Điều gì sẽ xảy ra nếu bạn ghi đè 'phân bổ' thay thế? –

+2

@RyanBigg Đó là một suy nghĩ tốt, nhưng nó không tạo ra sự khác biệt. Các chuỗi ký tự được đánh giá và tạo đối tượng của chúng tại thời gian biên dịch, bỏ qua cả 'initialize' và' allocate'. –

+0

@DarshanComputing, cảm ơn! Có vẻ như tôi phải hack và biên dịch lại Ruby từ nguồn để làm cho "" trả lại công cụ khởi tạo. Tôi sẽ đọc thêm về chữ. – amorphid

Trả lời

9

Theo Matz:

Chuỗi đối tượng cho literals đã tạo ra trong thời gian biên dịch, mà là xa trước khi bạn xác định lại phương pháp khởi tạo. Chuỗi riêng lẻ các đối tượng từ các văn bản chỉ là bản sao của các đối tượng đã được cấp phát và . Toàn bộ mục đích của phương thức khởi tạo là để khởi tạo các đối tượng mới được tạo, như tên cho thấy. Tôi không cảm thấy bất kỳ nhu cầu gọi phương thức khởi tạo (được xác định lại) cho chuỗi literals, đã được khởi tạo vào thời gian biên dịch.

+0

Tất nhiên, đó là cách nó hoạt động trong khá nhiều ngôn ngữ lập trình khác nữa. Hai ví dụ duy nhất tôi biết trong đó cho phép quá tải các chữ là Ioke và Seph. –

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