Soru Ruby yöntemi, Proc ve blok karışıklığı


Ruby'nin yöntemleri, prosedürleri ve beni oldukça tuhaf kılan bloklar hakkında birkaç sorum var. Söz dizimi hakkında çok fazla değiller ya da verilen kararların ardındaki mantık olarak işlev görüyorlar.

Soru 1:

Neden bloklar yöntemlere (örneğin her biri) geçirilebilir, ancak bir değişkene atanamazlar?

Bunları prosedürlerde geçirebileceğinizi biliyorum, yani. p = Proc.new {...} (ile erişildi &p) ancak programcının bu yollardan geçmesi çok mantıklı değil.

Soru 2:

Yöntemler ve prosedürler arasında neden bir ayrım var?

Örneğin, bir işlevi tanımlama ve bu işlevi şu iki yolla arama görevini gerçekleştirebilirim:

def square(x)
    x**2
end

square(3)
=> 9

veya

square = lambda {|x| x**2}
square.call(3)
=> 9

Neden farklılaşma? Python'da, örneğin, hem standart yolla hem de square = lambda x: x**2 işlevi oluşturma ve onu atama ile aynı görevi yerine getirme square.


21
2017-08-07 17:45


Menşei




Cevaplar:


Soru 1: Bloklar nesne değildir, sözdizimsel yapılardır; Bu yüzden bir değişkene atanamazlar. Bu, nesneler için ayrılan bir ayrıcalıktır.

Soru 2: Yöntemler nesne değildir, bu yüzden mesaj alamazlar. Tersine, procs ve lambdas nesneleridir, bu yüzden yöntemler gibi çağrılmazlar, ancak iletiyle iletilen parametreler temelinde bir değer döndürmelerini söyleyen bir ileti almalıdırlar.

Procs ve Lambdas nesneleridir, böylece call mesaj ve isimlere atanabilir. Özetlemek gerekirse, prokların ve lambdaların garip bulduğunuz şekilde davranmasını sağlayan bir nesnedir. Yöntemler ve bloklar nesne değildir ve bu davranışı paylaşmazlar.


21
2017-08-07 17:54



Ruby her şeyin bir nesne olduğunu iddia ediyor. Bloklar bunlara uymak için nesneler olmalı ve argümanlar olarak geçebilirler, böylece kesinlikle bazı şekillerde nesneler gibi davranırlar. - rpjohnst
Blokları temsil etmek için bir nesne, bir proc veya bir lambda oluşturarak nesneler gibi davranmak için yapılabilir. Bu cihaz olmadan, sadece sözdizimsel yapılardır. - Pinochle
Blok nesneler vardır - bu lambda'nın (her neyse) amacıdır. - Chuck
Lambdalar özel bir uzmanlık ürünüdür. Ruby Programlama Dilinin 192 sayfasına bakın: books.google.com/... - Pinochle
yöntemler nesne olabilir: ruby-doc.org/core-2.2.2/Method.html - solstice333


En azından bir ölçüde, yöntemler Hangi nesneler:

class ABC
  def some_method
  end
end
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method>

Dahası, yerleşik bir sınıf var: Yöntem, belgelendiği gibi İşte.

Ayrıca şunu da görün: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

rasgele <bseg>Bu, her şey-bir-nesne şey ortaya çıkarmak için görünüyor. Bu özel durumda, sadece görmek için biraz daha kazmaya gidiyor.

(Bunu daha iyi anlamak için gerçekten çaba sarf etmeliyim: Daha derin bir anlayışa sahip olmanın esas olduğunu düşünmeye başladım.)


5
2017-08-07 18:38



Yöntemler, nesnelerini örnek olarak alırlar. Proc. İçinde ri belgeleri Method, 'method' kelimesi açıklamada kullanılmaz, ancak 'proc' olur. İki sınıf da aynı mesajları alır, ancak fark, nasıl çağrıldıkları ve yöntemlerin, prokların alması gereken başka bir nesnenin ad alanı içinde tanımlanmasıdır. callBaşka nesnelerden bağımsız olarak çağrılan ve var olan yöntem (daha önce de söylediğim gibi). - Pinochle
Ahh, başka bir fark ... Method almaz new mesaj, nerede Proc yapar. Yöntemler nesneler ise, tam anlamıyla nesneler değildirler (“tam”, nesnelerde görmek için kullandığımız tüm özelliklere sahip anlamına gelir). - Pinochle
Bu wikibooks bağlantısı yararlıdır. Teşekkürler. - David
Evet, bu wikibooks bağlantısı çok iyi. - Pinochle
Bu cevap daha fazla upvotes hak ediyor. Kabul edilen cevap karışıklığa yardımcı olmuyor ve bu doğru bir şey. - froginvasion


Yöntemler yöntemlerdir - bir nesnenin iletilere yanıt olarak alabileceği eylemlerdir. Onlar fonksiyon değildir.

Bloklar kapanır - kapsam alanını kaplayan işlevlerdir. Kavramsal olarak belirli bir nesneye "ait değiller".

Bazı dillerde, yöntemler yalnızca bir nesnenin üyesi olan işlevlerdir, ancak Ruby bunları bu şekilde görmez. Bir yöntemin sahip olduğu nesneden ayrılması, basit atamadan daha cerrahiye benzemektedir. Ruby, nesne yönlendirme modelini Smalltalk, modern OO'nun büyükbabası.


4
2017-08-07 18:00