Giả sử rằng tôi có một đối tượng, x
, có thể chấp nhận bất kỳ bộ chọn nào, s1
, s2
, ..., sn
. Hãy giả sử thêm rằng kết quả của bất kỳ bộ chọn nào trong số các bộ chọn này hoạt động trên đối tượng là đối tượng được cập nhật cùng loại. Tôi có thể sau đó "chuỗi" những selectors (miễn là họ điệp unary) như tôi muốn, chẳng hạn như:Chaining tin nhắn từ khóa
x s1 s2 ... sn
này sẽ đưa kết quả của x s1
và áp dụng selector s2
, sau đó áp dụng selector s3
để kết quả đó, v.v. Tôi muốn áp dụng một hoặc nhiều bộ chọn này theo một số thứ tự cho các kết quả khác nhau:
x s8 s2
Trong Smalltalk tôi có thể làm điều này nếu bộ chọn là thông điệp đơn nhất. Tuy nhiên, nếu các công cụ chọn của tôi là tin nhắn từ khóa, tôi không thể thực hiện việc này nữa. Nếu x
cá nhân chấp nhận selectors, s1:
, s2:
..., sn:
, thì sau đây không làm việc:
x s1: a1 s2: a2 ... sn: an
Có là ;
điều hành:
x s1: a1 ; s2: a2 ; ... ; sn: an
Nhưng sử dụng tầng : mỗi giai đoạn sửa đổi bản gốc x
trên đường đi và tôi không muốn sửa đổi x
trong trường hợp này.
Để thông điệp từ khóa dây chuyền, tôi nghĩ rằng tôi trái bằng cách sử dụng cú pháp sau với dấu ngoặc đơn:
(...(((x s1: a1) s2: a2) ... sn: an)
nào khiến tôi cảm thấy như tôi là lập trình trong LISP nếu tôi có 3 hoặc nhiều tin nhắn keywrod. Một ví dụ cụ thể về điều này có thể là một mảng đa chiều. Nếu foo
là một mảng 3 chiều, và bạn muốn truy cập vào một đối tượng ở vị trí 2,3,5 trong mảng, tôi nghĩ rằng nó sẽ trông giống như:
(((foo at: 2) at: 3) at: 5) some_object_selectors
Đó là một ví dụ nhỏ, tất nhiên, nhưng minh họa trường hợp. Người ta có thể có các loại đối tượng nhúng khác hoặc chuỗi các hoạt động đối tượng liên tiếp khác mà bạn quan tâm đến kết quả cuối cùng.
Có cách nào hấp dẫn hơn để thực hiện điều này trong Smalltalk không? Tôi giả không có một nhà điều hành, có lẽ anh em họ đến các nhà điều hành ;
(nói chúng tôi sử dụng &
ví dụ), trong đó sẽ chuỗi chúng, chẳng hạn như:
x s1: a1 & s2: a2 & ... & sn: an
Vì tôi muốn áp dụng các selectors trong bất kỳ hoặc gần như bất kỳ thứ tự mong muốn nào (đối với các kết quả có thể khác nhau), biểu mẫu chọn, s1:s2:s3:...
quá hạn chế. Ngoài ra, điều này mang lại một cơ sở mà đã tồn tại trong các ngôn ngữ khác, chẳng hạn như Ruby, nơi nó sẽ được tương đương biểu diễn như:
x.s1(a1).s2(a2)...sn(an)
Thiếu một nhà điều hành đặc biệt, một sự thay thế có thể là để vượt qua một loạt các cặp chọn đối số hoặc có thể là bảng tra cứu các cặp đối số chọn.Bảng tra cứu đòi hỏi thiết lập để thông qua literals (nó phải được tạo ra và dân cư), mà làm cho tôi nghiêng về một mảng kể từ khi tôi chỉ có thể viết nó như:
x { {s1. a1}. {s2. a2}. ... {sn. an} }
này vẫn còn một chút thời gian, và tôi m không phải như vậy chắc chắn đây là bất kỳ thanh lịch hơn so với chỉ sử dụng tất cả các dấu ngoặc đơn. Tôi sợ câu hỏi của tôi có thể ít nhất là một phần chủ quan, nhưng tôi quan tâm biết thực hành tốt nhất có thể là gì và liệu một nhà điều hành có tồn tại hay không. tiêu chuẩn cơ thể.
Câu hỏi hay, đôi khi được thể hiện dưới dạng đường ống thông báo hoặc đường ống - bạn không phải là người đầu tiên bỏ lỡ tính năng đó, nó thường xuyên được thảo luận trong danh sách gửi thư. Tôi khuyên bạn nên viết blog exbent http://blog.3plus4.org/2007/08/30/message-chains/ –
@ aka.nice vâng, có vẻ như họ đã đánh tôi với câu hỏi 8 năm trước. :) – lurker