2011년 6월 2일 목요일

More About Methods

Defining a Method

메서드를 선언할 때는 def 키워드를 이용한다. 메서드 이름은 반드시 소문자로 시작해야 한다. 뭔가를 묻는 메서드의 경우 대부분 ?로 끝난다. 위험하거나 객체의 값을 바꿔 버리는 메서드는 !로 끝난다.
형식 인수를 선언할 때는 괄호 안에 지역 변수를 차례로 적어준다.

def myNewMethod(arg1, arg2, arg3) # 3 arguments
   # Code for the method would go here
end

def myOtherNewMethod # No arguments
    # Code for the method would go here
end

메서드의 형식인수에 기본값을 정해 줄수 있다. 기본 값이란 매개변수를 명시적으로 넘겨주지 않았을 때 사용하는 값이다.
def coolDude(arg1="Miles", arg2="Coltrane", arg3="Roach")
 "#{arg1}, #{arg2}, #{arg3}."
end
coolDude»"Miles, Coltrane, Roach."
coolDude("Bart")»"Bart, Coltrane, Roach."
coolDude("Bart", "Elwood")»"Bart, Elwood, Roach."
coolDude("Bart", "Elwood", "Linus")»"Bart, Elwood, Linus."


메서드 내부에서 다른 메서드를 정의 한다면, 안쪽의 메서드는 바깥의 메서드가 실행될 때 정의된다. 메서드의 반환 값은 마지막으로 실행된 표현식의 결과값이거나 명시적으로 쓰인 return문의 값이 된다.

Variable-Length Argument Lists

개수가 정해지지 않은 가변 매개변수를 전달하고 싶거나 하나의 형식인수로 여러개의 매개변수를 모두 처리하고 싶다면 맨 마지막에 오는 가변 형식인수의 이름 앞쪽에 *를 붙여주면 된다.
def varargs(arg1, *rest)
 "Got #{arg1} and #{rest.join(', ')}"
end
varargs("one")»"Got one and "
varargs("one", "two")»"Got one and two"
varargs "one", "two", "three"»"Got one and two, three"


Methods and Blocks

메서드를 호출할 때 블록을 결합 할 수 있다. 보통 메서드 내부에서는 yield를 이용해서 이렇게 결합된 블록을 호출 한다.

def takeBlock(p1)
   if block_given?
   yield(p1)
   else
        p1
   end
end
takeBlock("no block")»"no block"
takeBlock("no block") { |s| s.sub(/no /, '') }»"block"


메서드 선언부의 마지막 형식인수 앞에 & 가 붙어있다면, 메서드 호출에 결합된 블록은 Proc 객체로 변환되어 형식 인수에 대입된다.
class TaxCalculator
 def initialize(name, &block)
   @name, @block = name, block
 end
 def getTax(amount)
   "#@name on #{amount} = #{ @block.call(amount) }"
 end
end
tc = TaxCalculator.new("Sales tax") { |amt| amt * 0.075 }
tc.getTax(100)»"Sales tax on 100 = 7.5"
tc.getTax(250)»"Sales tax on 250 = 18.75"


Calling a Method

클래스 모듈의 메서드를 호출할 때, 수신자 위치에 클래스 이름이나 모듈 이름을 적어준다.

File.size("testfile")
Math.sin(Math::PI/4)

수신자를 생략하면, 기본값은 self 가 되고 현재 객체를 나타낸다.
self.object_id»537794160
object_id»537794160
self.type»Object
type»Object


Return Values

호 출된 모든 메서드는 값을 반환한다. 메서드의 반환값은 메서드 실행 중 마지막으로 실행된 표현식의 결과 값이된다. 루비에도 수행중인 메서드에서 빠져나가는 return 문이 있다. 이 경우에는 return 문의 매개변수가 반환값이 된다. 하지만 return문을 쓸 필요가 없다면 생략하는 것이 루비표현식 이다.

def meth_on
"one"
end

puts meth_on

def meth_two(arg)
case
when arg > 0
"positive"
when arg < 0
"negative"
else
"zero"
end
end

puts meth_two(23)
puts meth_two(0)

def meth_three
100.times do |num|
square = num*num
return num, square if square > 1000
end
end

puts meth_three

>> one
>> positive
>> zero
[32, 1024]

return 매개변수로 여러 개의 값을 동시에 넘기면, 메서드는 배열의 형태로 값을 반환한다. 배열로 반환된 값을 모으기 위해서는 병렬 대입문을 이용할 수 있다.

Expanding Arrays in Method Calls

메 서드 선언부에서 형식인수 이름 앞에 * 를 붙이면 가변형식인수를 사용할 수 있다. 역으로 메서드를 호출할 때, 배열을 확장해서 구성 원소가 각각의 형식인수에 대응되도록 할수 있다. 이렇게 하려면 * 를 배열 매개변수 앞쪽에 붙여주면 된다.
def five(a, b, c, d, e)
 "I was passed #{a} #{b} #{c} #{d} #{e}"
end
five(1, 2, 3, 4, 5 )»"I was passed 1 2 3 4 5"
five(1, 2, 3, *['a', 'b'])»"I was passed 1 2 3 a b"
five(*(10..14).to_a)»"I was passed 10 11 12 13 14"


Making Blocks More Dynamic

print "(t)imes or (p)lus: "
times = gets
print "number: "
number = gets.to_i


if times =~ /^t/
 calc = proc { |n| n*number }
else
 calc = proc { |n| n+number }
end

puts((1..10).collect(&calc).join(", "))

>> (t)imes or (p)lus: t
>> number: 3
>> 3, 6, 9, 12, 15, 18, 21, 24, 27, 30

메서드의 마지막 매개변수 앞에 "&" 가 붙어 있다면, 루비는 이 매개변수를 Proc 객체로 간주한다. Proc 객체를 매개변수 리스트에서 빼내서, 이를 블록으로 변환한 다음 메서드에 결합하는 식으로 처리한다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...