2015-11-20 19 views
5

Tại sao tôi không thể điền vào danh sách với vòng lặp đơn giản này?Điền vào Danh sách có vòng lặp

new_data = [] 
for data <- old_data do 
    new_data = List.insert_at(new_data, -1, data) 
end 

Sau khi thao tác này, danh sách new_data của tôi vẫn trống, mặc dù vòng lặp N được thực hiện.

+1

Bạn nên nhớ rằng trong lập trình chức năng nói chung _everything_ là một biểu thức. Như @Gazler chỉ ra dưới đây, bạn có thể trực tiếp gán kết quả của việc hiểu cho một giá trị, do đó bạn không cần phải làm "khởi tạo giá trị thành một giá trị rỗng và sau đó gán nó" mẫu. –

+0

Nhân tiện, đây không phải là câu hỏi Erlang. Tôi đang xóa thẻ erlang khỏi điều này. –

Trả lời

16

Trong Elixir, bạn không thể thay đổi giá trị mà biến của bạn đang tham chiếu như được giải thích trong Are Elixir variables really immutable?. Đối với trong trường hợp này không phải là một "vòng lặp" nó là một list comprehension.

Bạn có thể gán cho là kết quả của một sự hiểu biết với:

new_data = for data <- old_data do 
    data 
end 

Phù hợp của bạn:

new_data = List.insert_at(new_data, -1, data) 

Biến new_data là địa phương để phạm vi của sự hiểu biết. Bạn có thể sử dụng giá trị new_data trước đó của mình, nhưng bạn sẽ không thể rebind cho phạm vi bên ngoài. Đó là lý do tại sao new_data vẫn là [] sau khi bạn hiểu. Các quy tắc phạm vi được giải thích trong http://elixir-lang.readthedocs.org/en/latest/technical/scoping.html

+0

Điều này thật thú vị. Cảm ơn bạn. Tôi biết các biến là không thể thay đổi. Nhưng tôi nghĩ rằng nếu tôi tuyên bố danh sách befor tôi có thể rebind nó. – 0xAffe

+0

Cảm ơn bạn! Điều này đã cho tôi cách quá lâu để tìm ra. – SMASH

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