#!/usr/bin/ruby

# 메서드

def do_something
  puts "Hello"
end

=begin
* 메서드 이름은 소문자와 숫자, 밑줄문자등을 사용합니다. 유니코드 문자도 괜찮습니다.
* '!' : 뭔가 주의가 필요한 메서드 뒤에는 '!'를 붙입니다.
* '?' : true/false를 반환하는 메서드 뒤에는 '?'를 붙입니다.
* '=' : 값을 할당하는 셋터 메서드 뒤에는 '='를 붙입니다.
=end

def plus_something(x, y=1) # 매개변수를 받을 수 있습니다. y에는 기본값을 줘봤습니다.
  x + y # 'return'을 사용하지 않아도, 제일 마지막 문장의 값이 반환됩니다.
end

def get_something(*args) # 변수 이름 앞에 '*'을 붙여서 임의 길이의 매개변수를 전달 받을 수 있습니다.
  puts "Hello"
end

def get_block(&block) # 변수 이름 앞에 '&'을 붙여서 블록을 전달 받을 수 있습니다.
  block.call(self)
end

# 예외 처리

def my_method
  begin
    # 여기서 예외가 발생하면,
  rescue
    # 여기에서 예외를 처리합니다.
  end
end

def my_method # 이렇게도 작성할 수 있습니다.
  # 여기서 예외가 발생하면,
  rescue
    # 여기에서 예외를 처리합니다.
  else
    # 예외가 발생하지 않았을 때 처리할 내용
  ensure
    # 예외가 발생했든 말든 처리할 내용
end


# 메서드 호출

my_method()

my_method # 괄호는 없어도 됩니다.

my_method(x,y)
my_method x, y

array = [1,2,3]
my_method(*array) # my_method(1,2,3)과 같습니다.

hash = {a:1,b:2}
my_method(**hash) # 해시에는 '**'를 사용합니다.

my_method do # 메서드에 매개변수로 블록을 전달합니다.
  # do something
end

my_method { # 메서드에 매개변수로 블록을 전달합니다.
  # do something
}



a = [1,2,3]
b = ["a","b","c"]
c = a.append(*b).reverse # 메서드 호출을 연결
puts c

reg = /foo/
"Hello".match(reg)&.values_at(1,2) # '&'를 붙이면 결과가 nil일 때에 이후 메서드가 실행되지 않도록 합니다.




END{
  # https://ruby-doc.org/3.2.2/syntax/methods_rdoc.html
  # https://ruby-doc.org/3.2.2/syntax/calling_methods_rdoc.html
}
