`& Method (: function)` ne anlama geliyor?


15

Ne anlama &method(:function)geliyor? Örneğin, bu satır var:

res = integrate(0, 1, a, &method(:function))

İki mükemmel cevap (şimdiye kadar). Seni şanslı!
Cary Swoveland

Yanıtlar:


13

Diyelim ki bir yöntemimiz var

def add_one(num)
  num + 1
end

ve bir dizi dizgi

arr = ["1", "2"]

mapDizesinden ilgili çıktılarına ait listeyi istiyoruz add_one.

Başlamak için arayabiliriz

nums = arr.map(&:to_i)

Bu aynı şey

nums = arr.map do |str|
  str.to_i
end

Görebilirsiniz Ruby ortalamasını: harita (adı &) ne yapar? bu konuda daha fazla bilgi için.

Ancak, aramak için işe yaramaz:

nums.map(&:add_one)

Neden? Çünkü sayıların yerleşik bir yöntemi yoktur add_one. Böylece bir NoMethodError.

Bu nedenle, yalnızca bir yöntem adı sağlamak yerine bağlı bir yöntemi:add_one iletebilirsiniz : method(:add_one)

nums.map(&method(:add_one))

Şimdi, her bir num olarak kullanılan çok alıcı için add_onebir yöntem, bu şekilde kullanılacak argümanlar . Yani, aslında aynı:

nums.map do |num|
  add_one(num)
end

Başka bir örnek vermek için aşağıdakileri karşılaştırın:

[1].map(&:puts)
# this is the same as [1].map { |num| num.puts }
# it raises NoMethodError

[1].map(&method(:puts))
# this is the same as [1].map { |num| puts num }
# it prints 1 successfully

Nitpick: Object#methodbir sınır döndürür Method, bir değil UnboundMethod. Yöntem bir alıcıya bağlanır çünkü onu bir örnek üzerinde çağırırsınız ve böylece ne selfolduğunu bilir , oysa Module#instance_methoddöndürür, UnboundMethodçünkü hangi örnekle birlikte kullanılacağını bilemez.
Jörg W Mittag

@ JörgWMittag Tamam düzeltme için teşekkürler, haklısın karıştırıyorum olmalı .instance_methodçünkü sadece (kusurlu) bellekle gidiyordum
max pleaner

10

method(:function)örtük alıcıya gönderilen bir mesajdır (bazen yöntem çağrısı olarak da adlandırılır ) (yani self). İletiyi methodörtük alıcıya (yani self) gönderir :functionve tek argüman olarak iletir.

:functionbir Symboldeğişmezdir, yani a Symbol. Symbol"bir şeyin adını" temsil eden bir veri türüdür.

Tekli önek ve işareti &operatörü a'yı Procbir bloğa "açar" . Yani Procbir bloğun beklendiği bir yerden geçmenizi sağlar . Nesne zaten a değilse Proc, to_prockendisini a'ya dönüştürmesine izin veren bir mesaj gönderilir Proc. (İşleç yalnızca bir bağımsız değişken listesinde ve yalnızca son bağımsız değişken için yasaldır. &Parametre listesindeki sigil'in çiftidir ve bir bloğu bir Procnesneye "yuvarlar" .)

Procyürütülebilir kodu temsil eden bir veri türüdür. Bu, Ruby'nin birinci sınıf altyordamları için temel kütüphane sınıfıdır.

Yani, bu ne işe yaradığı çağrısıdır methodüzerinde yöntemini selfile :functionargüman olarak, çağrı to_procdönüş değeri, "göz önüne sermek" Ortaya çıkan Procbir içine nesne bloğu ve çağrısına bu bloğu geçmesi integrategibi yazmış gibi bir şey

res = integrate(0, 1, a) do
  # something
end

Buradaki methodyöntem büyük olasılıkla bağlı bir nesneyi Object#methoddöndüren yöntemdir . Method

Yani, sonuçta, bu biraz

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end

Ancak genel olarak noktasız stil denen şeyle ifade edilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.