Ruby Language Variables locales


Exemple

Les variables locales (contrairement aux autres classes de variables) n'ont pas de préfixe

local_variable = "local"
p local_variable
# => local

Son étendue dépend de l'endroit où il a été déclaré, il ne peut pas être utilisé en dehors du périmètre "déclaration conteneurs". Par exemple, si une variable locale est déclarée dans une méthode, elle ne peut être utilisée que dans cette méthode.

def some_method
    method_scope_var = "hi there"
    p method_scope_var
end

some_method
# hi there
# => hi there

method_scope_var
# NameError: undefined local variable or method `method_scope_var'

Bien sûr, les variables locales ne se limitent pas aux méthodes, en règle générale , vous pouvez dire que, dès que vous déclarez une variable à l' intérieur d' un do ... end bloc ou wrapped accolades {} , il sera local et à SCOPED le bloc dans lequel il a été déclaré

2.times do |n|
    local_var = n + 1
    p local_var
end
# 1
# 2
# => 2

local_var
# NameError: undefined local variable or method `local_var'

Cependant, les variables locales déclarées dans if ou les blocs de case peuvent être utilisés dans la parent-scope:

if true
    usable = "yay"
end

p usable
# yay
# => "yay"

Bien que les variables locales ne puissent pas être utilisées en dehors de son bloc de déclaration, elles seront transmises à des blocs:

my_variable = "foo"

my_variable.split("").each_with_index do |char, i|
    puts "The character in string '#{my_variable}' at index #{i} is #{char}"
end
# The character in string 'foo' at index 0 is f
# The character in string 'foo' at index 1 is o
# The character in string 'foo' at index 2 is o
# => ["f", "o", "o"]

Mais pas aux définitions de méthode / classe / module

my_variable = "foo"

def some_method
    puts "you can't use the local variable in here, see? #{my_variable}"
end

some_method
# NameError: undefined local variable or method `my_variable'

Les variables utilisées pour les arguments de bloc sont (naturellement) locales au bloc, mais occulteront les variables précédemment définies, sans les écraser.

overshadowed = "sunlight"

["darkness"].each do |overshadowed|
    p overshadowed
end
# darkness
# => ["darkness"]

p overshadowed
# "sunlight"
# => "sunlight"