2012-04-06 7 views
5

Ruby에서 예약어에 대해 혼란스러워합니다."begin"및 "end"예약어가 있습니까?

Matz이 공동 저술 한 "The Ruby Programming Language"에 따르면 beginend은 해당 언어의 예약어입니다. 블록을 표시하기 위해 구문 적으로 확실히 사용됩니다.

그러나, 언어의 범위 객체는 방법이 밖으로 테스트 지금

(1..10).end 
=> 10 

같이 endbegin 이름을 지정하고 한 나는, 참으로, 나는 "끝"시작 "이라는 방법을 정의 할 수 있습니다 것을 발견 "개체에, 비록 내가 변수를"시작 "이름을 지정하려고하면 실패합니다. (다음은 메소드 이름으로 사용하는 샘플 그래서 ... :) 실제로 작동

class Foo 
    def begin 
    puts "hi" 
    end 
end 

Foo.new.begin 

있어,이 같은 예약어의 상태가 실제로 무엇인가, 내가 부탁 해요 생각? 나는 메소드 이름에 사용할 수 없다고 상상 했었을 것이다. (적어도 아직은 작동하는 것처럼 보인다.) 최소한 끔찍한 스타일 일 것이다. (실제로 Range 클래스의 핵심 언어로 사용된다.)

나는 그들이 언제 사용할 수 있는지에 대해 꽤 혼란 스럽다. 거기에 문서가 있습니까?

답변

10

예, 예약어입니다. 예, 메소드 이름에 사용할 수 있습니다. 아니, 명시 적 리시버 없이는 호출 할 수 없습니다. 어쨌든 그것은 좋은 생각이 아닙니다.

class Foo 
    def if(foo) 
    puts foo 
    end 
end 

Foo.new.if("foo") # outputs foo, returns nil 

업데이트 : 여기 마츠 (루비의 창조자) 혼자서 "루비 프로그래밍 언어"에서 인용입니다 :

대부분의 언어에서

,이 말은 "예약 된 단어라는 것은 "및 식별자로 허용되지 않습니다. Ruby 파서는 이며 유연하며 @, @@ 또는 $ prefixes로 접두사를 붙이고 인스턴스, 클래스 또는 전역 변수 이름으로 사용하면 불만하지 않습니다. 또한이 키워드를 메서드 이름으로 사용할 수 있습니다. 개체를 통해 메서드를 항상 명시 적으로 호출해야한다는 경고가 표시됩니다.

+0

모든 "예약어"에 해당됩니까? 잘못된 스타일 인 경우 핵심 API가 왜 그렇게합니까? (직관적으로 그것은 끔찍한 스타일처럼 보이지만 실제로는 언어가 허용하는 끔찍한 것입니다.) 그리고 * *이 문서화되어 있습니까? – Perry

+0

예약어와 같은 메서드를 사용하는 것이 의미가있을 수 있으므로 (IMHO'Range # end') 좋은 예입니다. 항상 흑백이 아닌 것은 대부분의 기능과 마찬가지로주의해서 사용하면 도움이 될 수 있습니다. 문서에 관해서는, 빠른 Google 검색은 http://www.tutorialspoint.com/ruby/ruby_syntax.htm을 열었습니다. "[t] hese 예약어는 상수 또는 변수 이름으로 사용되지 않을 수 있습니다. , 메서드 이름으로 사용 ", IMHO 완벽하게 이해합니다. –

+0

공식적인 문서 인 것 같지 않습니다. (공식 문서에는이 문서에 대한 언급이 없지만 그것이 존재하지 않는다는 것을 의미하지는 않습니다.) – Perry

2

명확한 메소드 호출 형식으로 주어지면이를 사용할 수 있습니다. 마침표가 .begin이거나 괄호 뒤에 begin() 인 경우 명확하게 메소드 호출입니다. 변수 begin으로 사용하려고하면 원칙적으로 모호합니다.

사실, 페리는 메모가 begin() 일 수 있습니다. 루비 1.9.3와 IRB으로 확인, 다음과 같은 이상한 일이 발생합니다 마지막 평가 3을 반환 단지 블록을

irb(main):001:0> def begin(foo) 
irb(main):002:1> puts 'a' 
irb(main):003:1> end 
=> nil 
irb(main):004:0> begin(3) 
irb(main):005:1> 
irb(main):006:1* end 
=> 3 

이 그것은 정의되지 않은, 어떤 메서드 호출과 같은 것이 될 수 있습니다. 그러나 def begin(foo) 주변의 선은 여전히 ​​수수께끼로 남아 있습니다.

+1

괄호에 관한 귀하의 주장은 적어도 루비 1.9.3에서는 거짓으로 보입니다. begin()은 저에게 효과적이지 않습니다. – Perry

+0

@sawa 이상한 것은 없습니다. 괄호는 블록 몸체 주위에 - 불필요한 - 괄호로 해석됩니다. 그래서 3이 반환됩니다. Wy 첫 번째 정의는 이해할 수없는 미스터리이다. 모든 메소드 정의는'nil'과'self.methods.grep (/ beg /) # => [: begin]'을 리턴한다. IRB에'send (: begin)'만 입력하면 작동합니다. –

+0

@MichaelKohl'def begin (foo)'로 시작하는 정의에 정의 된 것은 무엇입니까? – sawa

관련 문제