Ne anlama &method(:function)geliyor? Örneğin, bu satır var:
res = integrate(0, 1, a, &method(:function))
Ne anlama &method(:function)geliyor? Örneğin, bu satır var:
res = integrate(0, 1, a, &method(:function))
Yanıtlar:
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
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.
.instance_methodçünkü sadece (kusurlu) bellekle gidiyordum
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 .