2015-08-08 5 views
7

s1, s2, ..., sn, x numaralı herhangi bir nesneyi kabul edebileceğimi düşünelim. Ayrıca, nesne üzerinde çalışan bu seçmenlerden birinin sonucunun, aynı türden güncellenmiş bir nesne olduğunu varsayalım. Sonra "zincir" gibi ben istedikleri gibi (yeter ki tekli mesajlar olduğu gibi) bu seçiciler, olabilir:Zincirleme anahtar sözcükleri zincirleme

x s1 s2 ... sn 

Bu x s1 sonucunu alıp seçici s2 uygulayacaktır, ardından seçici s3 uygulamak Bu sonuç, vb. Çeşitli sonuçlar için bazı sırayla bu seçicileri bir veya daha fazla uygulamanız gerekir: seçiciler tekli mesajlar ise Smalltalk yılında

x s8 s2 

Bunu yapabilirim. Ancak, seçicilerim anahtar kelime iletileri ise, artık bunu yapamam. x bireysel seçicileri, s1:, s2:, kabul ederse ..., sn:, ardından aşağıdaki çalışmaz: basamaklı

x s1: a1 ; s2: a2 ; ... ; sn: an 

Ama kullanarak:

x s1: a1 s2: a2 ... sn: an 

; operatör yoktur : Her aşama, yol boyunca orijinal x değiştirir ve bu durumda x değiştirmek istemiyorum. Zincir kelime mesajlar için

, ben parantez ile aşağıdaki sözdizimini kullanarak sol düşünüyorum:

(...(((x s1: a1) s2: a2) ... sn: an) 

Ben 3 veya daha fazla keywrod mesajlar varsa ben LISP'de programlama olduğum gibi hissettiriyor hangisi. Bunun spesifik bir örneği çok boyutlu bir dizi olabilir. foo 3 boyutlu bir dizi olduğunu ve dizide konumda 2,3,5 bir nesneye erişim isteseydim, o şekilde görünecektir düşünüyorum: Elbette, önemsiz bir örnek var

(((foo at: 2) at: 3) at: 5) some_object_selectors 

ama göstermektedir dava. Bir başka türde gömülü nesneler veya son sonuçla ilgilendiğiniz birbirini takip eden nesne işlemleri zinciri olabilir.

Smalltalk'ta bunu yapmak için sözdizimsel olarak daha çekici bir yol var mı? Ben seçiciler uygulamak istiyorum bu yana

x s1: a1 & s2: a2 & ... & sn: an 

: Başka operatör, ; operatöre belki kuzeni (diyelim biz örneğin & kullanın) gibi zincirleyin hangi, yok varsayarak ediyorum herhangi bir veya hemen hemen istenen herhangi bir sırada (muhtemelen farklı sonuçlar için), seçici form, s1:s2:s3:... çok sınırlayıcıdır. Ayrıca, bu gibi eşdeğer ifade edilir zaten böyle Ruby gibi diğer diller, var olan bir tesis verir:

x.s1(a1).s2(a2)...sn(an) 

özel operatör eksik, alternatif vites bağımsız değişken çiftlerinin bir dizi geçmek olabilir veya belki seçici argüman çiftlerinin bir arama tablosu.Arama tablosu olarak ben sadece bunu yazabilir beri beni bir dizi düşkündürler yapar (oluşturulduktan ve doldurulması gereken) değişmezleri geçirilmesi için kurulum gerektirir: Bu hala biraz aksak

x { {s1. a1}. {s2. a2}. ... {sn. an} } 

, bense Bu, tüm parantezleri kullanmaktan daha zarif olduğundan emin değil. Korkarım ki sorum en azından kısmen öznel olabilir, ama en iyi uygulamanın ne olabileceğini ve bir operatörün yardım edebileceğinin farkında olmadığım bir operatör olup olmadığını veya bir Smalltalk tarafından eğlendirilip eğlendiğini öğrenmek istiyorum. standartlar gövdesi.

+0

İyi soru - böyle bir özelliği kaçırmak için değil İlki, düzenli posta listesine tartışılan oluyor. Ben exellent blog http://blog.3plus4.org/2007/08/30/message-chains/ –

+0

@ aka.nice evet, bana 8 yıl önce bana soruları yenmek gibi görünüyor. :) – lurker

cevap

1

Normalde bu nesne üzerinde işlem ve biz onunla bittiğinde o zaman bu değiştirilen konu istemek için bir konu x verir. Kopyalama oldukça verimsizdir.

Object subclass: #Foo 
    instanceVariableNames: 'subject' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'Try' 

order: y 
    self subject order: y 

select: z 
    self subject select: z 

subject 
    ^subject ifNil: [ subject := FooSubject new ] 

where: x 
    self subject where: x 
+0

Anladım. Örneğin, tüm parantezlere başvurmak zorunda kalmadan Ruby'de yapıldığı gibi x.s1 (a1) .s2 (a2) ... sn (an) ile aynı etkiyi elde etmenin bir yolunu arıyordum. Konu x, farklı işlemlerde farklı seçicilerle farklı işlemler uygulamak isteyebileceğim bir şey. Yani değiştirmek istemiyorum. Eğer değişirse, o zaman bu durumda da kopyalarını kopyalamak zorundayım, böylece orijinal formuna tekrar sahibim.Üzerinde bazı işlemlerin yapıldığı bir nesneyi kaydetmek istersem, şunu yapardım: 'newX: = x s1: a1 | Örneğin s3: a3.'. – lurker

+0

Neye ulaşmaya çalışıyorsunuz? Bu yapıyla nasıl anlaşılır bir kod yazılacağından emin değilim. –

+0

Bu tür yapı Ruby on Rails'de yaygın olarak kullanılır. "ActiveRecord" ile sorgu oluştururken, Foo.where (...) .sipariş (...). (()) 'Yi seçin, ancak Foo'yu değiştiremezsiniz. Kodun semantiği oldukça açıktır. Belki bu durumda, Smalltalk paradizinde, her seferinde Foo'nun bir kopyasını yapmalı ve operatörlerin bunu değiştirmesine izin vermeliyim. Bunu biraz düşünmek zorundayım. – lurker

8

Burada bir karışıklık var gibi görünüyor.

  1. Basamaklı her mesaj aynı argümanı gönderilir ; kullanılarak yapılır. (Eğer "basamaklı" denilen)
  2. Sizin x s1 s2... örnek denir mesajı her mesaj nedeniyle sadece Object message ve olan Smalltalk sözdizimi güzel ve zarif yapısı nedeniyle (önceki mesajın sonucu gönderilir, zincirleme her zaman bir sonuç verir). Ve hayır, onları her zaman sıraya koyamazsın. s1'un multiplyByTwo olduğunu ve s2'un addTwo olduğunu ve ile 1 olarak başlayan bu yöntemlerle değiştirilmiş bir örnek değişkenine sahip olduğunu hayal edin. Sipariş önemli olabilir. (Örnek olarak böyle çok kısa kısa isimleri kullanma konusunda çok isteksiz olduğumu lütfen unutmayın - çok Smalltalk benzeri değil. ;-)
  3. n, parantezleri kullanmanın garip görünmesini sağlayacak kadar büyükse, o zaman, uhm .. Üzgünüm, ama yanlış yapıyorsun.
    • birden fazla argüman kabul edecek nesne üzerinde bir yöntem oluşturmayı düşünün.
    • Parametrelerinizi taşımak için bir sarıcı nesne oluşturmayı düşünün.
    • bunu gerçekleştirmek istediğiniz işlemleri adresinin nesneyi ayrıştırmak için bir desen modeli kullanmayı düşünün. (. Hangi model size ne elde etmek istediğinizi bağlıdır gerek; here's a good starting point)

yerine başka şeyler yapıyor için kullanılabilir nasıl (Iradesine Smalltalk eğmek bir operatörün arayan dilleri), Smalltalk'ın yerine (açık isimlendirme, daha fazla nesne ve yöntem yaratmaktan korkmama vb.) bükülmesini öneririm. Uzun vadede bundan daha fazlasını elde edersiniz, ve diğer dilin Smalltalk'ın sadeliği ve gücü olduğunu dilediğiniz noktaya geleceğinizi söyleyebilirim. bazen mesaj boru veya boru hattının olarak ifade

+0

Giriş için teşekkürler. Özür diledim yanlış terminoloji vardı. Kısa bir süre önce ST'yi öğrenmeye başladım ve terimlerin farkını çoktan unutmuştum. Ne kadar büyük, n 'ne kadar büyük, ne kadar büyük? Sanırım 4 veya 5 ise çirkin görünüyor. Ama bu öznel. Elbette dil felsefesini daha iyi anlamaya çalışıyorum ve bunun hakkında çok şey okudum. Mutlaka "onu irademle bağlamaya çalışmak" değil, anlamaya çalışmak. Benim için (ST'ye yeni bir dönüşüm), * zincirleme * yeteneği sadece argümanları olmayan seçmenler benim için tutarsız görünüyordu. – lurker

+0

Farkettim ki her zaman istediğim sıraya göre mesaj koyamıyorum. Benim durumumda, bunu yapmak istediğim bir problem hakkında konuşuyordum. Bu yüzden, 's1: s2: s3: ... 'gibi davranmayı başaramadım. Bağlantıyı sağladığın için teşekkürler, okuyacağım. – lurker

+0

Özür dilemeye gerek yok, sadece açıklığa kavuşturacağımı düşündüm, çünkü soruları ilk okuduğumda kafam karışmıştı. Ve tabi ki, öznel olmak konusunda haklısın. Ben sadece Smalltalk'a diğer dillerden gelen insanların yeni (küçük) nesneler ve yöntemler yaratmak konusunda daha isteksiz olma eğiliminde olduklarını buldum. Mesaj siparişi hakkında yeterince iyi, açıkladığın için teşekkürler. Muhtemelen bir paternin peşindeymişsin gibi geliyor. _get_ Smalltalk'ı denemek için Kudos! :-) –