2015-01-02 2 views
2

왜 다음 부분은 # def games # @games = games # end 코드의 맨 끝 부분에 올 수 있습니까? 나는 루비가 코드를 위에서 아래로 읽는다고 생각했다. 상단에 games을 정의하지 않으면 오류가 발생하지 않아야합니까?루비 코드 순서

class Library 
    # def games 
    # @games 
    # end 
    def initialize(games) 
    @games = games 
    end 
    def add_game(game) 
    games << game 
    end 
    # The following lines should come at the top of this code. 
    def games 
    @games 
    end 
end 

games = ['WoW','SC2','D3'] 
lib = Library.new(games) 
lib.games #=> WoW,SC2,D3 
lib.add_game('Titan') 
lib.games #=> WoW,SC2,D3,Titan 
+3

게임이 정의되기 전에'games'를 호출하지 않으므로 작동합니다. – August

+2

코드를 읽고 (메모리에 저장하고, 클래스를 설정하고, 메소드를 설정하는 것), 실행하는 것과는 차이가 있습니다. 실행/사용 중일 때 정의해야합니다. Ruby 나 Javascript와 같은 언어는 코드를 실행할 때 두 개의 별개의 단계를 가지며 첫 번째 (로드 및 설정)와 두 번째 (실제 실행)를 혼동하지 마십시오. 3 단 계는 런타임 중에 코드를 컴파일하고 프로파일 링하는 것입니다 (컴파일 할 부분을 결정하는 후자). 10 년 또는 2 년 전 수동으로 고정 바이너리를 작성해야했던 작업 ... 이제 모든 것 훨씬 더 역동적입니다. –

+0

@ Mörre : 그 대답이어야합니다! – quetzalcoatl

답변

3

메서드가 정의되면 루비가이를 실행하지 않습니다. 인스턴스를 호출 한 후에 사용할 수 있습니다.

일반적으로 내 코드가 커질 때 쉽게 탐색 할 수 있도록하기 위해 알파벳 순서로 내 메서드를 넣습니다. 이것은 개인적인 취향입니다.

루비는 클래스/모듈을 구조화하고 구성 할 수 있지만 논리적/유익합니다.


은 정의 할 때 루비 클래스가 이 실행됩니다 명확히하기 위해,하지만 방법은 없습니다.

example.rb

class Example 
    puts "hello" 

    def my_method 
    puts "world" 
    end 
end 

실행이

$ ruby example.rb 
hello 

루비 클래스를 실행하기 때문에 매크로 같은 것들 루비 클래스에서 작동하는 방법, 그건.

class Example2 
    attr_accessor :foo 
end 

attr_accessor은 클래스가 실행될 때 호출되는 메소드입니다. 이 경우 attr_acessor은 인스턴스 변수 @foo에 대한 get 및 set 함수를 설정합니다.

Ruby가 클래스를 실행하지 않은 경우이 코드는 일종의 초기화 도구에서 수동으로 호출해야합니다.


당신이해야 할 모든하는 방법을 정의 방법 및 를 호출 을 구별하는 법을 배워야합니다. 정의 된 메소드는 자동으로 실행되지 않습니다.

+0

예를 들어, 클래스가 파싱되는 동안 클래스 메소드를 호출 할 수 있기 때문에 좀 더 정확할 수 있습니다. 예 :'class A; def self.a; puts 'hi'; 종료; 에이; 끝 => 안녕하세요. btw, 당신은 치과 의사를 만나고 싶을지도 모른다. 가장 오른쪽 절치 옆에 오른쪽 상단 송곳에 구멍이있는 것 같습니다. –

+0

@CarySwoveland <3 – naomik

+0

나는 내가 틀렸다고 생각한다 (그러나 구멍에 관한 것은 아니다). 내 예제에서 클래스 메소드가 빌드 될 때까지 클래스 메소드'a'가 호출되지 않는다고 생각합니다. 클래스 A를 실행하면; def self.a; puts 'hi'; 출구; 종료; 루비는 '안녕'과 '출구'를 말하지 않고 '끝'을 참을성있게 기다린다. –

0

Ruby에서 클래스가 으로 인해 그 이유가 있습니다 : Ruby 클래스의 모든 인스턴스 메소드 정의는 위에서 아래로 파싱하는 동안 먼저 정의됩니다. 그런 다음 각 메소드를 호출 할 때 정의 된 것인지 아닌지와 순서가 아닌지가 중요합니다.

아래의 방법을 재정의하는 경우 해당 순서가 중요하다고 말하면됩니다. 그러면 우선 순위가 낮아집니다.

+0

나는 파싱하는 동안 정의 된 메서드를 생각하지 않습니다. – sawa

+0

그러면 언제 끝나요? 그 다음에 –

+0

. ....................... – sawa