- Оба они являются объектами Proc.
proc = Proc.new { puts “Hello world” } lam = lambda { puts “Hello World” } output: proc.class # returns ‘Proc’ lam.class # returns ‘Proc’
- Лямбда-выражения определяются с помощью
-> {}
, а процессы — с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
.