Để đưa ra một bối cảnh nhỏ xung quanh cách tôi hiểu vấn đề.Tại sao toán tử splat/unary thay đổi giá trị được gán khi p được gọi trước * a = ""?
Sử dụng splat thu thập trên một chuỗi gửi: to_a hay: to_ary để String
class String
def method_missing method, *args, &block
p method #=> :to_ary
p args #=> []
p block #=> nil
end
end
*b = "b"
Vì vậy, tôi đã suy nghĩ rằng xác định lại: Phương pháp to_ary sẽ là những gì tôi sau đó.
class String
def to_ary
["to_a"]
end
end
p *a = "a" #=> "a"
p a #=> "a"
*b = "b"
p b #=> ["to_a"]
Hiện tại điều này khiến tôi không thể kết thúc.
In kết quả từ * a = "a" thay đổi giá trị được gán cho?
Để chứng minh thêm
class String
def to_ary
[self.upcase!]
end
end
p *a = "a" #=> "a"
p a #=> "a"
*b = "b"
p b #=> ["B"]
Đúng vậy. Đó là tất cả về sự ưu tiên. 'p * a =" a "' có nghĩa là 'p (* (a =" a "))', không phải 'p (* a =" a ")'. –
Yup chính xác, tôi đã chỉnh sửa để thêm một chút ghi chú làm rõ. – robbrit