2011-11-17 35 views
50

Birden çok aralığın her yöntemini aktarmak için kullanacağım bir bloğu tanımlamaya çalışıyorum. Aksine her dizi bloğu yeniden tanımlanması yerine, ben gibi lambda bir lamba oluşturmak ve iletmek isteyeceğiniz: neBir bloğu blok olarak geçirme

 
ArgumentError: wrong number of arguments(1 for 0) 
    from code.rb:23:in `each' 

Herhangi fikirleri:

count = 0 
procedure = lambda {|v| map[count+=1]=v} 
("A".."K").each procedure 
("M".."N").each procedure 
("P".."Z").each procedure 

Ancak, aşağıdaki hatayı alıyorum Buraya mı gidiyorsun?

cevap

65

Tack örneğin değişken üzerine bir işareti (&):

("A".."K").each &procedure 

Bu yöntemin özel bir blok parametre olarak geçerken anlamına gelir. Aksi takdirde normal bir argüman olarak yorumlanır.

# the & here signifies that the special block parameter should be captured 
# into the variable `procedure` 
def some_func(foo, bar, &procedure) 
    procedure.call(foo, bar) 
end 

some_func(2, 3) {|a, b| a * b } 
=> 6 
12

hüner gerekiyorsa Proc için bu tartışmayı dönüştürmek için Ruby söyleyen bir & kullanarak ve:

Ayrıca onlar yol yakalamak ve yönteme kendisi içeride blok parametresi erişmek istiyorum aynalar sonra nesneyi yöntem bloğu olarak kullanın. Ruby 1.9'dan başlayarak, lambda (anonim) işlevler için bir kısayol vardır. Yani, böyle bir kod yazabilirsiniz:

(1..5).map &->(x){ x*x } 
# => [1, 4, 9, 16, 25] 

gücünü

dizinin her öğesi alıp hesaplamak olacak bu kod aynıdır: Ruby 1.8 için

func = ->(x) { x*x } 
(1..5).map &func 

:

(1..5).map &lambda {|x| x*x} 
# => [1, 4, 9, 16, 25] 

(sen Dizisinin yöntemini reduce kullanabilirsinizsorununuzu çözmek için

('A'..'K').reduce(0) { |sum,elem| sum + elem.size } 
# => 11 

reduce için bir lambda fonksiyonu geçen biraz zor olmakla birlikte, anonim blok hemen hemen lambda olarak aynıdır: 8.923.210 başlangıç ​​değeri).

('A'..'K').reduce(0) { |sum, elem| ->(sum){ sum + 1}.call(sum) } 
# => 11 

Yoksa sadece bu gibi harfleri Concat olabilir: Geçen önüne bir ve işareti koyarak bir yöntem tanım bağlamında

('A'..'K').map &->(a){ a.downcase } 
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"] 

:

('A'..'K').reduce(:+) 
=> "ABCDEFGHIJK" 

dönüştürme küçük harfe parametresi, bir yöntemin bir blok alabildiğini ve yöntem gövdesi içinde bu bloğa başvurmak için bize bir ad verebileceğini belirtir.

İlgili konular