• Оба они являются объектами Proc.
proc = Proc.new { puts “Hello world” } 
lam = lambda { puts “Hello World” } 
output:
proc.class # returns ‘Proc’ 
lam.class # returns ‘Proc’
  1. Лямбда-выражения определяются с помощью -> {}, а процессы — с Proc.new {}.
#Lambda :
say_something = -> { puts “This is a lambda” }
say_something.call
# “This is a lambda”
#Proc:
t = Proc.new { |x,y| puts “I don’t care about arguments!” }
t.call
# “I don’t care about arguments!”

2. Процедуры возвращаются из текущего метода, а лямбды возвращаются из самой лямбды.

  • «return» внутри лямбда-выражения запускает код прямо вне лямбда-кода
def lambda_test   l
  am = lambda { return }   
  lam.call                
  puts "Hello world" 
end  
lambda_test            # calling lambda_test 
prints 'Hello World'
  • «return» внутри процедуры запускает код вне метода, в котором выполняется процедура.
def proc_test   
  proc = Proc.new { return }   
  proc.call   
  puts "Hello world" 
end  
proc_test           # calling proc_test 
prints nothing

3. Lambdas проверяет количество аргументов, а procs — нет.

  • Процессы не заботятся о правильном количестве аргументов, в то время как лямбда-выражения вызовут исключение.
lam = lambda { |x| puts x } # creates a lambda with 1 argument lam.call(2)                 # prints out 2 
lam.call                    # wrong number of arguments (0 for 1) 
lam.call(1,2,3)             # wrong number of arguments (3 for 1)
proc = Proc.new { |x| puts x } # creates a proc with 1 argument
proc.call(2)                   # prints out 2
proc.call                      # returns nil
proc.call(1,2,3)               # prints out 1 and forgets about the extra arguments
  • lambdas намного ближе к обычному методу, чем procs.