Ich denke, viele Leute wissen, dass sie irgendwie enden, Ich denke, dass viele Leute es nicht verstanden haben, weil die Hürden ein wenig steigen würden, wenn Proc herauskommt. Daher zusammen mit der Neuorganisation meines Wissens Wir haben es so zusammengestellt, dass viele Leute Rubys Grammatik gut verstehen und effizient codieren können.
Mit --ruby können Sie eine Reihe von Prozeduren an eine Methode übergeben
--block wird durch do end
oder {}
beschrieben
-Das Argument ist|x|
mögen|
Schreiben Sie es wie eine normale Methode
[*1..3].each do |i|
p i
end
# => 1
# => 2
# => 3
3.times { |i| p i }
# => 0
# => 1
# => 2
def three_times
3.times { yield }
end
three_times { p 'a' }
# => "a"
# => "a"
# => "a"
def three_times
3.times { |j| yield(j) }
end
three_times { |i| p i }
# => 0
# => 1
# => 2
def calculate
p yield(1, 2)
p yield(2, 3)
end
calculate { |a, b| a + b }
# => 3
# => 5
calculate { |a, b| a * b }
# => 2
# => 6
def three_times(&block)
3.times { yield } rescue p $!
end
three_times
# => #<LocalJumpError: no block given (yield)>
def three_times
p block_given?
end
three_times
# => false
three_times { p 'y' }
# => true
--block kann mit &
zum und vom Proc-Objekt konvertiert werden
&
als Argument zu verwenden, wird er anstelle von Lambda verwendet (der Unterschied zwischen proc und Lambda wird später beschrieben).proc_object = Proc.new do |a|
p a
end
3.times(&proc_object)
# => 0
# => 1
# => 2
def three_times(&block)
3.times { |j| block.call(j) }
end
three_times { |i| i }
# => 0
# => 1
# => 2
--Proc-Objekte haben "Proc" und "Proc (Lambda)" (als proc bzw. Lambda bezeichnet).
Proc.new { |x| }
Oderproc { |x| }
Schreiben
-Lambda istlambda { |x| }
Oder->(x) { }
Schreibenp Proc.new {}
# => #<Proc:0x00007f3e59459978@/tmp/nvimaASrm8/2:1>
p Proc.new {}.instance_of?(Proc)
# => true
p lambda {}
# => #<Proc:0x00007f3e59459838@/tmp/nvimaASrm8/2:2 (lambda)>
p lambda {}.instance_of?(Proc)
# => true
--Wenn das Argument extra ist --proc: Durch --lambda: Fehler tritt auf
x = proc { |a, b| p [a,b] }
x.call(:a, :b, :c)
# => [:a, :b]
x = lambda { |a, b| p [a,b] }
x.call(:a, :b, :c) rescue p $!
# => #<ArgumentError: wrong number of arguments (given 3, expected 2)>
x = proc { |a, b| p [a,b] }
x.call(:a)
# => [:a, nil]
x = lambda { |a, b| p [a,b] }
x.call(:a) rescue p $!
# => #<ArgumentError: wrong number of arguments (given 1, expected 2)>
--Wenn in der Methode ausgeführt, die Proc definiert
** Wenn Sie das Ergebnis der Prozedur zurückgeben möchten, verwenden Sie "next" sowohl in Lambda als auch in proc! **
def hoge
x = proc { return 2 }.call
p "x: #{x}"
return 1
end
p "method: #{hoge}"
# => "method: 2"
def hoge
x = lambda { return 2 }.call
p "x: #{x}"
return 1
end
p "method: #{hoge}"
# => "x: 2"
# => "method: 1"
def hoge
x = proc { break 2 }.call
p "x: #{x}"
return 1
end
p "method: #{hoge}" rescue p $!
# => #<LocalJumpError: break from proc-closure>
def hoge
x = lambda { break 2 }.call
p "x: #{x}"
return 1
end
p "method: #{hoge}"
# => "x: 2"
# => "method: 1"
def hoge(x)
p "x: #{x.call}"
return 1
end
x = proc { break 2 }
p "method: #{hoge(x)}" rescue p $!
# => #<LocalJumpError: break from proc-closure>
x = lambda { break 2 }
p "method: #{hoge(x)}"
# => "x: 2"
# => "method: 1"
Recommended Posts