27
loading...
This website collects cookies to deliver better user experience
puts "#{prefix} #{name}"
, estas variáveis dentro do escopo terá o valor "Sra" e "Loren" e não mais "Sr" e "Diego" como foram definidas anteriormente. Essa é uma regra do escopo léxico, a variável mais próxima, vence.prefix = 'Sr'
name = 'Diego'
4.times do
prefix = 'Sra'
name = 'Loren'
msg = 'Olá!'
puts "#{msg} #{prefix} #{name}"
end
=> Sra Loren
=> Sra Loren
=> Sra Loren
=> Sra Loren
prefix
e name
definidas nas primeiras linhas. Ja a variável msg
utilizada está dentro do mesmo escopo de execução, portanto não é uma variável livre.do / end
ou entre chaves {block}
e os argumentos vão dentro de pipes |args|
. Métodos famosos como o .each
, .times
e outros são bons exemplos de Blocks.method { |i| ... }
method do |i|
...
end
each
:[1,2,4,5].each do |number|
puts number
end
times
:prefix = 'Sr'
name = 'Diego'
4.times do
puts "#{prefix} #{name}"
end
=> Sra Diego
=> Sra Diego
=> Sra Diego
=> Sra Diego
def full_name
first_name = 'Diego'
last_name = 'Novais'
"#{first_name} #{last_name}"
end
puts full_name
=> Diego Novais
def full_name
yield
end
full_name do
first_name = 'Diego'
last_name = 'Novais'
"#{first_name} #{last_name}"
end
=> Diego Novais
def full_name(prefix)
puts prefix + yield
end
full_name('Sr. ') do |prefix|
first_name = 'Diego'
last_name = 'Novais'
"#{first_name} #{last_name}"
end
=> Sr. Diego Novais
each
:def my_each(array)
i = 0
while i < array.size do
yield array[i]
i += 1
end
end
array = [1, 2, 3, 4, 5]
my_each(array) do |number|
puts number
end
def full_name(&block)
block.call
end
full_name do
first_name = 'Diego'
last_name = 'Novais'
"#{first_name} #{last_name}"
end
=> Diego Novais
def full_name(prefix, &block)
puts prefix + block.call
end
full_name('Sr. ') do |prefix|
first_name = 'Diego'
last_name = 'Novais'
"#{first_name} #{last_name}"
end
=> Sr. Diego Novais
proc
não se importa se irá passar um argumento ou não., vamos analisar isso com um pouco mais de código:say_something = proc { puts "Something..." }
say_something.call
=> Something...
say_something = Proc.new do
puts 'Something...'
end
say_something.call
=> Something...
say_something = Proc.new do |name|
puts "Hello #{name}"
end
say_something.call('Diego')
=> Hello Diego
say_something.call
=> Hello
# say_something = lambda { puts "Something..." }
# ou...
say_something = -> { puts "Something..." }
say_something.call
=> Something...
say_something = -> (name) { puts "Hello #{name}" }
say_something.call('Diego')
=> Hello Diego
say_something = lambda do |name|
puts "Hello #{name}"
end
say_something.call('Diego')