Menu
Coddy logo textTech

Proc와 람다

Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 19번째.

블록은 객체가 아니므로 변수에 저장할 수 없습니다. 전달하거나 저장하고 나중에 호출할 수 있는 코드 조각이 필요할 때는, 이를 Proc이나 lambda로 감쌉니다.

Proc은 Proc.new 또는 proc 키워드로 생성됩니다. .call을 사용하여 호출합니다:

double = proc { |n| n * 2 }
puts double.call(5)   # 10
puts double.call(7)   # 14

람다(lambda)는 비슷하지만 더 엄격하며, 올바른 개수의 인수를 전달했는지 확인합니다. 화살표 형태인 ->가 일반적인 표기법입니다:

square = ->(n) { n * n }
puts square.call(4)   # 16
puts square.(4)       # 16  (.call의 약칭)

둘 다 &를 앞에 붙여서 블록을 기대하는 메서드에 전달할 수 있습니다:

[1, 2, 3].map(&double)   # [2, 4, 6]
[1, 2, 3].map(&square)   # [1, 4, 9]

더 엄격한 인자 확인을 원할 때는 lambda를 사용하고, 더 가볍고 관대한 동작을 원할 때는 Proc을 사용하세요.

challenge icon

챌린지

쉬움

하나의 숫자를 받아서 3을 곱한 값을 반환하는 tripler라는 이름의 람다(lambda)를 생성하세요.

그런 다음 쉼표로 구분된 정수 리스트를 읽고, 다음 내용을 각각 별도의 줄에 출력하세요:

  1. tripler.call(10)을 호출한 결과
  2. 입력받은 숫자들에 3을 곱한 결과(map(&tripler)를 사용하세요)를 , 로 연결한 문자열

입력값이 1,2,3인 경우, 출력값은 다음과 같습니다:

30
3, 6, 9

치트 시트

Proc – 변수에 저장된 재사용 가능한 블록:

double = proc { |n| n * 2 }
double.call(5)   # 10

Lambda – 더 엄격한 인자 체크, 화살표 문법:

square = ->(n) { n * n }
square.call(4)   # 16
square.(4)       # 16 (단축 표기)

&를 사용하여 블록을 기대하는 메서드에 Proc/lambda를 전달합니다:

[1, 2, 3].map(&double)   # [2, 4, 6]

직접 해보기

# TODO: `tripler`를 람다로 정의하세요

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: 첫 번째 줄, tripler.call(10)을 출력하세요
# TODO: 두 번째 줄, numbers를 &tripler로 매핑하고 ", "로 연결하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨