2011-06-23 36 views

Trả lời

11

Có, nhưng bạn không thể sử dụng dấu ngoặc nhọn ({}) cho danh sách đối số của mình. Bạn khai báo quy trình, ví dụ: theo cách này:

proc log [list message [list output $::output]] { 
    .... 
} 

Nhưng lưu ý:
Biến được đánh giá vào thời điểm khi các thủ tục được khai báo, không phải khi nó được thực thi!

+2

+1: Đó là hoàn hảo cho giá trị mặc định định nghĩa thời gian. –

7

Nếu bạn muốn một đối số mặc định chỉ được xác định bằng giá trị tại thời điểm bạn gọi, bạn phải khéo léo hơn. Điều quan trọng là bạn có thể sử dụng info level 0 để có được danh sách các đối số cho các cuộc gọi thủ tục hiện hành, và sau đó bạn chỉ cần kiểm tra độ dài của danh sách đó:

proc log {message {output ""}} { 
    if {[llength [info level 0]] < 3} { 
     set output $::output 
    } 
    ... 
} 

Hãy nhớ rằng, khi kiểm tra danh sách các đối số, một trong những đầu tiên là tên của lệnh.

+0

+1 để kiểm tra số lượng đối số được cung cấp, chỉ cần kiểm tra xem đầu ra có phải là chuỗi rỗng không! Vâng, bạn sẽ nhận được +1 cho câu trả lời hữu ích bất kể, nhưng tôi vui vì bạn đã làm theo cách đó :) – RHSeeger

+0

Câu trả lời hay, nhưng hãy chú ý rằng theo cách này bạn không thể phân biệt đối xử giữa người dùng với lệnh 'đăng nhập hello' "'và' log hello '. Bạn có thể thay đổi chuỗi đầu ra mặc định (thay đổi "") nhưng sau đó bạn nhận được một vấn đề tương tự với giá trị mới. Có thể không xảy ra thường xuyên nhưng khi nó xảy ra ... – Roalt

+0

@Roalt: Bạn có ý định đưa nhận xét đó vào câu trả lời khác không? Với của tôi, bạn có thể phân biệt bằng cách đơn giản _counting_ bao nhiêu giá trị đã được cung cấp thực sự. Nó là dễ dàng. –

1

Một cách khác để làm điều này:

proc log {message {output ""}} { 
    if {$output eq ""} { 
     set output $::output 
    } 
} 
Các vấn đề liên quan