[Ruby] 블록, 프로세스, 람다: yield, proc, lambda

OOING·2024년 10월 28일
0

Ruby & Ruby on Rails

목록 보기
10/11

새로운 배열을 반환하며 순회: .collect, .map

collect와 map은 같은 기능

my_nums = [1, 2, 3]
my_nums.collect {|x| x ** 2}
# ==> [1, 4, 9]를 반환, but 원본 배열(my_nums)은 변경되지 않음

new_nums = my_nums.collect {|x| x ** 2}
# new_nums = [1, 4, 9]
# my_nums = [1, 2, 3]

my_nums.collect! {|x| x ** 2|
# !를 붙이면 원래 배열을 변형

메소드의 제어권을 전달: yield

def block_test
	puts "a"
    puts "b"
    yield
    puts "c"
end

block_test {puts "d"}
# a -> b -> d -> c

yield를 통해 파라미터를 전달하는 것도 가능!

def yield_test(name)
	puts "Hello"
    yield(name)
    puts "Bye"
    yield("Rou")
end

yield_test("Sho") {|n| puts "My name is #{n}"}

# Hello
# My name is Sho
# Bye
# My name is Rou

프로세스: proc

Proc: 코드 블록을 객체로 만들어서 변수에 저장하거나 전달할 수 있도록 하는 기능 => Ruby의 객체지향!

프로세스 정의: .new

floasts = [1.2, 3.45, 5.6, 2.7]

round_down = Proc.new { |x| x.floor }

ints = floats.collect(&round_down)

프로세스 호출: .call

hi = Proc.new {puts "Hello!"}
hi.call
# Hello!

메소드를 전달: &:method_name

string = ["1", "2", "3"]
int = string.map(&:to_i)
# int = [1, 2, 3]

람다: lambda

lambda: 코드 블록을 객체로 만들어서 변수에 저장하거나 전달할 수 있도록 하는 기능 => Ruby의 객체지향!

람다 정의: lambda

my_lambda = lambda { |param| block }

my_array = ["string1", :symbol1, "string2", :symbol2]

symbol_filter = lambda {|param| param.is_a? Symbol}

symbols = my_array.select(&symbol_filter)
# symbols = [:symbol1, :symbol2]

proc과 lambda의 차이

  1. 인수 처리 방식

    • lambda : 인수 검사를 엄격히 함. 인수 수가 맞지 않으면 ArgumentError 발생
    • proc : 누락된 인수는 nil로 처리
  2. return 동작 방식

    • lambda : lambda의 return은 호출된 위치로 돌아가 다음 코드를 실행
    • proc : proc의 return은 정의된 메소드 전체를 즉시 종료시킴
def test_lambda
	my_lambda = lambda { return "Lambda finished"}
    result = my_lambda.call
    "Result after lambda: #{result}"  # 이 줄까지 모두 실행
end

puts test_lambda
# Result after lambda: Lambda finished


def test_proc
	my_proc = Proc.new { return "Proc finished"}
    result = my_proc.call  # test_proc 메소드 즉시 종료
    "Result after proc: #{result}"  # 이 줄은 실행되지 않음
end

puts test_proc
# Proc finished
profile
HICE 19

0개의 댓글