2010-04-06 29 views
18

Tôi đang tìm kiếm một số mã nguồn từ một bên thứ ba và liên tục nhìn thấy một cú pháp mới đối với tôi. Về cơ bản họ đang tách các câu lệnh bằng dấu phẩy thay vì dấu chấm phẩy. Nó biên dịch và làm việc, nhưng tôi không hiểu nó đang làm gì. Có vẻ như vậyTrong mục tiêu-C, dấu phẩy làm gì khi được sử dụng làm dấu phân tách câu lệnh?

if(url)[url release], url = nil; 

và họ cũng sử dụng nó mà không có sự nếu đôi khi

[url release], url = nil; 

gì đang xảy ra ở đây?

+0

Điều này không hữu ích trong trường hợp này và chỉ gây khó đọc hơn. Trường hợp nó có thể hữu ích là nếu một số chuyển nhượng đã xảy ra với hai biến với một bản phát hành, như: var1 = [var2 release], var2 = nil; nhưng ngay cả trong trường hợp này, một khối sẽ làm cho nó sạch hơn, dễ đọc hơn nhiều và dễ dàng hơn nhiều để gỡ lỗi. –

+1

Đồng ý về sự không rõ ràng của ví dụ đầu tiên, nhưng thứ hai không quá tệ trong việc thực hiện dealloc, mặc dù dấu chấm phẩy thay vì dấu phẩy sẽ làm điều tương tự. Tôi tìm thấy nó dễ dàng hơn để đọc cho một danh sách dài các bản phát hành, bởi vì bạn không có dòng xen kẽ làm hai việc khác nhau. Về mặt ngữ nghĩa, phát hành một đối tượng và đặt nó thành nil giống như một thao tác đơn (hoặc nên là nếu bạn muốn tránh zombie). –

Trả lời

15

Như trong C và C++, toán tử dấu phẩy tính toán điều ở bên trái của nó và sau đó tính toán điều ở bên phải; giá trị tổng thể của biểu thức là giá trị của phía bên phải. Về cơ bản, điều này cho phép một biểu thức duy nhất làm hai việc (một ở phía bên trái được cho là có tác dụng phụ như gọi phương thức hoặc chuyển nhượng). Có, cú pháp hơi mơ hồ với điều đó được sử dụng trong các cuộc gọi hàm và khai báo biến.

Tôi thích sử dụng khối trung thực có chứa nhiều câu lệnh nếu có thể. Lâu hơn, nhưng cuối cùng sạch hơn. Dễ dàng gỡ lỗi quá.

+0

Tôi hoàn toàn đồng ý với Donal, đặc biệt là đối với loại điều này. Không sử dụng một khối ở đây chỉ là lười biếng và khó đọc hơn. –

+0

Cảm ơn. Tôi chắc chắn sẽ tránh sử dụng nó cho mục đích này trong mã của riêng tôi. Tôi rất vui vì tôi biết bạn có thể làm điều này ngay bây giờ. Có thể hữu ích ở nơi khác. –

+0

Hoàn toàn đồng ý với Donal về việc sử dụng nhiều câu lệnh thay vì cú pháp này. – skantner

3

Đây là các biểu thức được phân cách bằng dấu phẩy và được đánh giá từ trái sang phải, với kết quả của toàn bộ biểu thức là biểu thức cuối cùng được đánh giá.

2

Đây là một trong tôi yêu thích "tính năng" của C, ObjC, vv ...

Hiểu điều hành này mở ra tất cả các loại khả năng jQuery-like.chain-able.commands, và một ngắn gọn hơn (thoug-số-sẽ-cãi-ít có thể đọc được) biểu hiện của thành ngữ nHIỀU chung .. Ví dụ ...

-(id)init { 
    return self != super.init ? nil : [self setProperty:@"EPIC"], 
    NSLog(@"One line inits are: %@.", _property), self;  } 

LOG ➜One line inits are: EPIC.

+4

Tôi sẽ tát ai đó trong một đánh giá mã cho việc này. Cá nhân tôi thấy rất khó đọc và không cần thiết. Nhưng đó chỉ là ý kiến ​​của tôi. –

+1

Tôi là một mục tiêu khét tiếng cho nhiều "cuộc tấn công tát" ... nhưng than ôi, nhiều người đã thử, và hầu hết đã thất bại - để tát "như" ra khỏi tôi - qua những thứ "như thế này", thở dài. –

+1

Vì mục đích rõ ràng và đơn giản, tôi khuyên bạn nên tránh viết một phương thức init như vậy. – Dustt

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