[RUBY] Über Rubinblock

Überblick

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.

Was ist ein Block?

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

So erstellen Sie eine Methode, die Block verwendet

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)>

Stellen Sie fest, ob der Block übergeben wurde

def three_times
  p block_given?
end

three_times
# => false
three_times { p 'y' }
# => true

Ich möchte einen Block als Instanz behandeln

--block kann mit & zum und vom Proc-Objekt konvertiert werden

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 und Lambda

--Proc-Objekte haben "Proc" und "Proc (Lambda)" (als proc bzw. Lambda bezeichnet).

p 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

Unterschied zwischen Proc und Lambda

Umgang mit Argumenten

--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)>

brechen, Verhalten zurückgeben

--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

Über Rubinblock
Über Ruby-Symbole
Über Ruby-Arrays
Informationen zur Ruby-Vererbung
Über Ruby Hash
Über Ruby-Symbole
Über Ruby-Methoden
Über Rubys Kernel-Modul
Informationen zu Ruby-Fehlermeldungen
Über Ruby Hash (Fortsetzung)
Über Logik nachdenken Ruby
Erläuterung des Ruby Range-Objekts
Über Ruby-Hashes und -Symbole
Ruby über verschiedene iterative Prozesse
Über =
Über Ruby und Objektmodell
Informationen zu Ruby-Klassen und -Instanzen
Erläuterung zum Ruby String-Objekt
Über das Verhalten von Ruby Hash # ==
Über Ruby einfache Anführungszeichen und doppelte Anführungszeichen
Informationen zum Ruby-Produktoperator (&) und zum Summenoperator (|)
[Super Einführung] Über Symbole in Ruby
[Ruby] Es gibt Ausbeute, aber kein Blockargument
Über objektorientierte Vererbung und über Ertrag Ruby
Erklärt Ruby Array-Objekte
Über method.invoke
Rubin lernen 4
Über Kotlin
Über attr_accessor
[Ruby] Array
Über Hinemos
Rubin lernen 5
Über die Vererbung
Ruby-Grundlagen
Über Docker
Über Schienen 6
Über den Frühling ③
Ruby lernen 3
Über Aufzählung
Über Polymorphismus
Über Optional
Über JitPack
Über die Kapselung
Ruby-Einstellung 2
Über JAVA_HOME