본문 바로가기

개발/Ruby on Rails

Ruby : 기초(5) 메소드

반응형

메소드(method)

루비의 함수는 클래스에 들어있든 아니든 메소드(경우에 따라 메서드)라고 불립니다.

# 인자가 없으면 괄호를 생략할 수 있다
# 기본값이 없으면 생략할 수 있다
def 메소드명(인자명=기본값)
  # 코드블럭
end

블록의 표시 방법

루비에서 블록을 표시하는 방법은 두 가지가 있습니다. 중괄호({ })와 do-end입니다.

중괄호는 한 줄로 정의할 때 사용됩니다.

반환 값은 따로 지정하지 않아도 괜찮다

특별히 지정되지 않은 경우, 메소드는 마지막 줄의 결과값을 반환합니다.

가변 매개 변수(argument)

루비의 메소드는 한 매개 변수에 별표(*)를 붙임으로써 여러 인자(parameter)를 받을 수 있습니다.
모호함을 막기 위해 가변 매개 변수는 한 개만 허용됩니다.

def function(var1, *varArr)
  puts var1
  varArr.each { | v | print v }
end

function(1, 2, 3, 4, 5) # [ 2, 3, 4, 5 ]가 varArr에 들어감
# 1
# 2345

메소드 이름에 특수문자

루비의 메소드는 이름의 마지막에 ? ! =를 넣을 수 있습니다.
이는 각 함수가 어떤 행동을 하는지 알려 주는 일종의 표식입니다.

method? # method함수가 true / false를 반환한다는 의미
method! # 이 함수를 호출하면 값이 변한다는 의미
method= # 내부의 값을 직접적으로 변경할 수 있다는 의미

str = "hello!"
str.upcase # "HELLO!"
puts str # "hello!"
str.upcase! # "HELLO!"
puts str # "HELLO!"

method=는 내부의 값을 직접적으로 변경할 수 있다는 의미이며,
이는 즉 좌변에 메소드가 올 수 있음을 의미합니다.

class Item
  @price = 100
  def price=(new_p)
    @price = new_p
  end
...

i = Item.new
i.price = 200

맵 메소드 collect

다른 언어의 map을 루비에서는 collect라고 지칭하고 있습니다.
입력에 대해 주어진 연산을 처리하고, 그 결과를 반환합니다.

[ 1, 2, 3, 4, 5 ].collect { | i | i % 3 }
# [ 1, 2, 0, 1, 2 ]

리듀스 메소드 inject

다른 언어의 reduce을 루비에서는 inject라고 지칭하고 있습니다.
입력에 대해 주어진 연산을 처리하고, 결과를 하나로 모아 반환합니다.

[ 2, 3, 4, 5, 6 ].reduce(1) do | sum, i |
  puts "SUM : #{sum}  I : #{i}"
  sum + i
end
# SUM : 1  I : 2
# SUM : 3  I : 3
# SUM : 6  I : 4
# SUM : 10  I : 5
# SUM : 15  I : 6
# 21

[ 2, 3, 4, 5, 6 ].reduce do | sum, i | # 인자를 전달하지 않으면 첫 번째 값이 초기값
  puts "SUM : #(sum)  I : #{i}"
  sum + i
end
# SUM : 2  I : 3
# SUM : 5  I : 4
# SUM : 9  I : 5
# SUM : 14  I : 6
# 20

'개발 > Ruby on Rails' 카테고리의 다른 글

Mac의 zsh에서 rbenv 사용하기  (0) 2020.05.31
Ruby : 기초(6) 클래스  (0) 2020.03.14
Ruby : 기초(4) 해시와 심볼  (0) 2020.03.14
Ruby : 기초(3) 반복  (0) 2020.03.13
Ruby : 기초(2) 연산  (0) 2020.03.13