Ruby Language Blocs


Exemple

Les blocs sont des morceaux de code entre accolades {} (généralement pour les blocs à une seule ligne) ou do..end (utilisés pour les blocs à plusieurs lignes).

5.times { puts "Hello world" } # recommended style for single line blocks

5.times do
    print "Hello "
    puts "world"
end   # recommended style for multi-line blocks

5.times {
    print "hello "
    puts "world" } # does not throw an error but is not recommended

Remarque: les accolades ont une priorité plus élevée que do..end

Céder

Les blocs peuvent être utilisés dans les méthodes et les fonctions en utilisant le mot yield :

def block_caller
    puts "some code"
    yield
    puts "other code"
end
block_caller { puts "My own block" } # the block is passed as an argument to the method.
#some code
#My own block
#other code

Attention, si yield est appelé sans bloc, il LocalJumpError une LocalJumpError . block_given? fournit à cette fin une autre méthode appelée block_given? cela vous permet de vérifier si un bloc a été passé avant d'appeler le rendement

def block_caller
  puts "some code" 
  if block_given? 
    yield
  else
    puts "default"
  end
  puts "other code"
end
block_caller 
# some code
# default
# other code
block_caller { puts "not defaulted"}
# some code
# not defaulted
# other code

yield peut également fournir des arguments au bloc

def yield_n(n)
  p = yield n if block_given?
  p || n 
end
yield_n(12) {|n| n + 7 } 
#=> 19 
yield_n(4) 
#=> 4

Bien qu'il s'agisse d'un exemple simple, le yield peut être très utile pour permettre un accès direct aux variables d'instance ou aux évaluations dans le contexte d'un autre objet. Par exemple:

class Application
  def configuration
    @configuration ||= Configuration.new
    block_given? ? yield(@configuration) : @configuration
  end
end
class Configuration; end

app = Application.new 
app.configuration do |config| 
  puts config.class.name
end
# Configuration
#=> nil 
app.configuration
#=> #<Configuration:0x2bf1d30>

Comme vous pouvez le constater, l'utilisation de yield de cette manière rend le code plus lisible que l'appel continu de app.configuration.#method_name . Au lieu de cela, vous pouvez effectuer toute la configuration à l'intérieur du bloc en conservant le code contenu.

Les variables

Les variables pour les blocs sont locales au bloc (similaire aux variables des fonctions), elles meurent lorsque le bloc est exécuté.

my_variable = 8
3.times do |x|
    my_variable = x 
    puts my_variable
end
puts my_variable
#=> 0
# 1
# 2
# 8

Les blocs ne peuvent pas être enregistrés, ils meurent une fois exécutés. Pour enregistrer des blocs, vous devez utiliser procs et lambdas .