À propos de Ruby Block

Aperçu

Je pense que beaucoup de gens savent qu'ils utilisent une fin en quelque sorte, Je pense que beaucoup de gens ne l'ont pas compris parce que les obstacles augmenteraient un peu lorsque proc sortait. Par conséquent, en plus de réorganiser mes connaissances Nous l'avons compilé pour que de nombreuses personnes puissent bien comprendre la grammaire de ruby et coder efficacement.

Qu'est-ce qu'un bloc

--ruby vous permet de passer une série de procédures à une méthode --block est décrit par do end ou {} -L'argument est|x|comme|Écrivez-le de la même manière qu'une méthode normale

[*1..3].each do |i|
  p i
end
# => 1
# => 2
# => 3

3.times { |i| p i }
# => 0
# => 1
# => 2

Comment créer une méthode qui utilise le bloc

--Utiliser yield ** pour exécuter le bloc ** ou ** Utiliser & bloquer (voir ci-dessous) **

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

Déterminer si le bloc a été passé

--Utilisez block_given?

def three_times
  p block_given?
end

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

Je veux traiter un bloc comme une instance

--block peut être converti vers et depuis l'objet Proc en utilisant &

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

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

Différence entre proc et lambda

Traitement des arguments

--Lorsque l'argument est extra --proc: à travers --lambda: une erreur se produit --S'il n'y a pas assez d'arguments --proc: devient nul --lambda: une erreur se produit

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

rupture, comportement de retour

--Lorsqu'il est exécuté dans la méthode qui définit Proc

** Si vous voulez renvoyer le résultat de la procédure, utilisez next à la fois dans lambda et 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

À propos de Ruby Block
À propos des symboles Ruby
À propos des tableaux Ruby
À propos de l'héritage Ruby
À propos de Ruby Hash
À propos des symboles Ruby
À propos des méthodes Ruby
À propos du module Ruby's Kernel
À propos des messages d'erreur Ruby
À propos de Ruby Hash (suite)
Réflexion sur la logique Ruby
Explication sur l'objet Ruby Range
À propos des hachages et symboles Ruby
Ruby à propos de divers processus itératifs
À propos =
À propos de Ruby, modèle objet
À propos des classes et des instances Ruby
Explication sur l'objet Ruby String
À propos du comportement de ruby Hash # ==
À propos des guillemets simples et doubles Ruby
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
[Super Introduction] À propos des symboles dans Ruby
[Ruby] Il y a yield mais pas d'argument de bloc
À propos de l'héritage orienté objet et du rendement Ruby
Explique les objets Ruby Array
À propos de method.invoke
Ruby apprentissage 4
À propos de Kotlin
À propos de attr_accessor
[Ruby] Tableau
À propos de Hinemos
Ruby apprentissage 5
À propos de l'héritage
Bases de Ruby
À propos de Docker
À propos des rails 6
À propos du printemps ③
Ruby apprentissage 3
À propos d'énumération
À propos du polymorphisme
À propos facultatif
À propos de JitPack
À propos de l'encapsulation
Paramètre Ruby 2
À propos de JAVA_HOME