2013-09-05 39 views
5

Tôi đến từ một nền javascript nặng và học clojure.Cách gán giá trị mặc định nếu giá trị hiện tại bằng 0 trong Clojure?

Trong js chúng ta có thể làm;

var aVariable; //evaluates as falsy 
var x = aVariable || 'my Default String'; 

Làm cách nào bạn thực hiện việc này trong clojure?

Hiện tại tôi đang đọc một tiêu đề trong một bản đồ yêu cầu đến từ compojure.

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"])] 
    (println x-forwarded-for) 
) 

Trong trường hợp tiêu đề 'x-chuyển tiếp-cho' không tồn tại, giá trị chuyển tiếp x là không. Cách thích hợp để kiểm tra cho nil là gì và sau đó gán lại x-forwarded-for cho một giá trị khác?

Trả lời

8

May mắn là get-in chức năng has a not-found parameter cho chính xác trường hợp sử dụng này:

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"] 
           "default value")] 
    (println x-forwarded-for)) 

Nói chung, bạn có thể sử dụng or như @prismofeverything nói.

+1

Thực ra, việc sử dụng 'hoặc' để đặt giá trị dự phòng rất thành ngữ trong mã mà tôi đã thấy. – Alex

9

Bạn có thể sử dụng được xây dựng trong or:

(let [x-forwarded-for (or (get-in request [:headers "x-forwarded-for"]) "my Default String")] 
    (println x-forwarded-for)) 

Nếu mệnh đề đầu tiên là nil, nó sẽ sử dụng thứ hai.

+0

Đây là thành ngữ và hoạt động tốt, nhưng phải cẩn thận xung quanh dữ liệu boolean, như 'false' cũng sẽ gây ra nó để rơi qua (đó là chưa rõ ràng từ câu hỏi OP của dù đó là mong muốn hành vi ở đây). – Alex

1

fnil được thiết kế cho việc này

user> ((fnil println "hello") nil) 
hello 
nil 
user> ((fnil println "hello") "world") 
world 
nil 
user> ((fnil println "hello") false) 
false 
nil 
+0

điều này khá thú vị ... một trường hợp đặc biệt (giống như gọi ngay một tiện ích được thiết kế cho chức năng currying), nhưng khả năng sử dụng rộng rãi hơn để tạo hàm curried với mặc định chỉ áp dụng trong một ngữ cảnh nào đó thực sự thú vị – jm0

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