2015-01-14 5 views
0

메서드의 기본 매개 변수에서 변수를 사용할 수 있습니까? 그렇지 않다면 왜 그럴까요? 이 루비에 1.8.7메서드의 기본 매개 변수에서 변수를 사용할 수 없습니다.

var = "one" 

def sysout(str=var) 
    puts str 
end 

sysout("seven") 
sysout() 

오류 -

seven 
test.rb:3:in `sysout': undefined local variable or method `var' for main:Object (NameError) 
     from test.rb:8 
+0

선택 사항이 있으면 1.8.7을 사용하지 않아야합니다. 18 개월 동안 일몰이되었습니다. 현재 버전은 2.2.0입니다. –

답변

4

임의의 Ruby 표현식을 선택적 매개 변수의 기본 인수 값으로 사용할 수 있습니다. 거기에 넣을 수있는 내용은 전혀 없습니다. 단일 한 문자 그대로 단순하거나 전체 응용 프로그램만큼 복잡 할 수 있습니다. (비록 나는 후자를 추천하지 않는다.)

그러나 루비의 스코프 규칙은 마술처럼 사라지지 않는다. 지역 변수는 여전히 지역 변수이고, 전역 변수는 여전히 전역 변수입니다.

블록이 중첩 된 범위를 만들 루비의 유일한 것들, 그래서 당신은 블록 사용해야합니다 : 또는

var = 'one' 

define_method(:sysout) do |str=var| 
    puts str 
end 

sysout('seven') 
# seven 

sysout 
# one 

을, 기본 값을 방법을 만들 수 :

def var; 'one' end 

def sysout(str=var) 
    puts str 
end 

sysout('seven') 
# seven 

sysout 
# one 

또는 전역 변수 :

$var = 'one' 

def sysout(str=$var) 
    puts str 
end 

sysout('seven') 
# seven 

sysout 
# one 
+0

감사합니다. 이 줄을 설명해 주시겠습니까? (1) define_method (: sysout) (2) def var; '하나'끝. Thanks – stack1

+0

(1)은 심볼': sysout'과 블록을 인수로 전달하는'define_method' 메소드를 호출합니다. 'define_method'가 그 이름에서 무엇을하는지 추측 할 수 있습니다. 그렇지 않다면, 문서를 찾아보십시오. (2) Ruby에서 메소드는'def' 키워드로 정의되므로'var' 메소드를 정의합니다. –

0

당신이 변수를 사용할 수 있지만 정의 된 지역 변수 varsysout의 메소드의 인수의 위치와 범위를 공유하지 않습니다 정의.

관련 문제