Tôi gặp phải tác dụng phụ lạ lùng này gây ra lỗi hoặc nhầm lẫn. Vì vậy, hãy tưởng tượng rằng đây không phải là một ví dụ tầm thường nhưng một ví dụ về một gotcha có lẽ.Tại sao xẻng kép ở trạng thái không biến đổi của Ruby?
name = "Zorg"
def say_hello(name)
greeting = "Hi there, " << name << "?"
puts greeting
end
say_hello(name)
puts name
# Hi there, Zorg?
# Zorg
Điều này không làm thay đổi tên. Tên vẫn là Zorg
.
Nhưng bây giờ hãy nhìn vào một sự khác biệt rất tinh tế. trong ví dụ tiếp theo này:
name = "Zorg"
def say_hello(name)
greeting = name << "?"
puts "Hi there, #{greeting}"
end
say_hello(name)
puts name
# Hi there, Zorg?
# Zorg? <-- name has mutated
Bây giờ, tên là Zorg?
. Khùng. Sự khác biệt rất tinh tế trong nhiệm vụ greeting =
. Ruby đang làm một cái gì đó bên trong với phân tích cú pháp (?) Hoặc thông điệp đi qua chuỗi? Tôi nghĩ rằng điều này sẽ chỉ chuỗi xẻng như name.<<("?")
cùng nhưng tôi đoán điều này không xảy ra.
Đây là lý do tại sao tôi tránh toán tử xẻng khi cố gắng ghép nối. Tôi thường cố gắng tránh tình trạng đột biến khi tôi có thể nhưng Ruby (hiện tại) không được tối ưu hóa cho điều này (chưa). Có lẽ Ruby 3 sẽ thay đổi mọi thứ. Xin lỗi vì thảo luận về phạm vi-creep/bên về tương lai của Ruby. Tôi nghĩ điều này đặc biệt kỳ lạ vì ví dụ có ít tác dụng phụ hơn (ví dụ đầu tiên) có hai toán tử xẻng trong đó ví dụ có nhiều tác dụng phụ hơn có ít công cụ xẻng hơn.
Cập nhật Bạn đúng DigitalRoss, tôi đang làm cho nó quá phức tạp. Ví dụ bị giảm:
one = "1"
two = "2"
three = "3"
message = one << two << three
Bây giờ bạn nghĩ mọi thứ được đặt thành? (không nhìn trộm!) Nếu tôi phải đoán tôi muốn nói:
one is 123
two is 23
three is 3
message is 123
Nhưng tôi đã sai về hai. Hai là 2.
Chỉ cần lưu ý, cách hợp quy để nối chuỗi trong Ruby là nội suy, thay vì nối với chuỗi cộng hoặc xẻng kép. cùng với nhau. Tôi đoán rằng Matz đã chọn để làm cho xẻng đôi liên kết cách nó để hỗ trợ các trường hợp sử dụng "a" << b << "c". Nếu không, mọi người đến từ các ngôn ngữ như C++ sẽ rất ngạc nhiên khi thấy các phản ứng phụ. Re tránh trạng thái biến đổi, Ruby hỗ trợ kiểu dáng chức năng cũng như nhiều kiểu khác; Ruby không phải là ngôn ngữ chức năng thuần túy và tôi nghĩ đó là ý định. – bloopletech
Hoàn toàn. Tôi thường làm "# {one} # {two} # {three}". – squarism