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|
# !를 붙이면 원래 배열을 변형
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
: 코드 블록을 객체로 만들어서 변수에 저장하거나 전달할 수 있도록 하는 기능 => Ruby의 객체지향!
floasts = [1.2, 3.45, 5.6, 2.7]
round_down = Proc.new { |x| x.floor }
ints = floats.collect(&round_down)
hi = Proc.new {puts "Hello!"}
hi.call
# Hello!
string = ["1", "2", "3"]
int = string.map(&:to_i)
# int = [1, 2, 3]
lambda
: 코드 블록을 객체로 만들어서 변수에 저장하거나 전달할 수 있도록 하는 기능 => Ruby의 객체지향!
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]
인수 처리 방식
ArgumentError
발생nil
로 처리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