2013-08-10 5 views
0

이 코드가 있습니다구문 오류, 예기치 못한 keyword_end

class TVShow 
    attr_accessor :name 
    attr_accessor :tvdbID 

    def initialize(showName) 
     :name = showName 
    end 
end 

을 그리고 그것은 나에게이 오류 제공 :

syntax error, unexpected '=', expecting keyword_end 
     :name = showName 

는 내가 뭘하고 싶은거야 것은 대중이입니다 변수는 내가 전체 클래스에 걸쳐 사용할 수 있습니다. 그래서 그 이름과 : tvdbID를 사용하여 작업하려고합니다.

저는 루비가 처음이에요. 내가 잘못했는지 알려주세요.

+0

무엇이 질문입니까? (TM) – sawa

+2

질문은 명백합니다. – 7stud

답변

2

변경 :

def initialize(showName) 
    :name = showName 
end 

def initialize(showName) 
    @name = showName 
end 
당신이 할 수있는

:

attr_accessor :name, :tvdbID 

몇 가지 예 :

class Dog 
    def initialize(name) 
    @name = name 
    end 

    def show 
    puts "I am a Dog named: " + @name 
    end 

    def add_last_name(last_name) 
    @name = @name + " " + last_name 
    end 

end 

d = Dog.new "Fred" 
d.show 
d.add_last_name("Rover") 
d.show 

--output:-- 
I am a Dog named: Fred 
I am a Dog named: Fred Rover 

그래서 인스턴스 변수는 클래스 내에서 자유롭게 액세스 할 수 있습니다. 그러나 클래스 외부에서 위의 예에서는 인스턴스 변수에 액세스 할 수 없습니다 :

class Dog 
    def initialize(name) 
    @name = name 
    end 

    def name #getter 
    @name 
    end 

    def name=(val) #setter 
    @name = val 
    end 
end 

d = Dog.new "Fred" 
puts d.name 

--output:-- 
Fred 

그 getter 및 setter는 다음과 같습니다

다음
d = Dog.new "Fred" 
puts d.name 

--output:-- 
1.rb:17:in `<main>': undefined method `name' for #<Dog:0x000001010a5b48 @name="Fred"> (NoMethodError) 

당신이 클래스 외부에서 인스턴스 변수에 액세스 할 수있는 방법입니다 10 개의 인스턴스 변수라고이 특히 - - 고통을 입력하기 때문에 루비 바로 가기 제공 :

class Dog 
    def initialize(name, age) 
    @name = name 
    @age = age 
    end 

    attr_accessor :name, :age 

end 

d = Dog.new("Fred", 5) 
puts d.name 
puts d.age 
d.age = 6 #calls age=() method 
puts d.age 

--output:-- 
Fred 
5 
6 

를하지만에 attr_accessor 라인을 작성하는 관례 수업 시작.

+0

그러면 내 기호의 값은 @name이됩니까? – Andrew

+2

모든 인스턴스 변수는 @로 시작합니다. @name은 인스턴스 변수입니다. 모든 인스턴스 변수는 private입니다.getter와 setter 메소드 (접근 자 메소드라고도 함)를 작성하여 인스턴스 변수에 대한 액세스를 제공 할 수도 있고, 루비가'attr_accessor : name'을 작성하여이를 수행 할 수도 있습니다. @가 없다는 것에주의하십시오. 하지만 인스턴스 변수는 기본적으로 전체 클래스에서 사용할 수 있습니다. 즉, 인스턴스 변수가 그 것입니다. 이를 위해 접근 자 메서드가 필요하지 않습니다. 나는 그 예를 올릴 것이다. – 7stud

+0

감사합니다. 이해합니다. – Andrew

0

Ruby에서 attr_accessor은 필드 (인스턴스 변수)의 setter 및 getter (mutator 읽기)를 정의하기위한 속기입니다. 따라서 및 gettername으로 만들려는 경우 당신은 여분의 보일러 플레이트 코드를 써야 할 것입니다. 당신은

tvshow = TVShow.new 
tvshow.name = 'Stack Overflow' 
puts "New tv show : #{tvshow.name}" 

:attr_accessor :name와 클래스의 객체를 생성 할

class TVShow 
    def name=(name) 
    @name = name 
    end 

    def name 
    @name 
    end 

#Similarly other instance variables. 
#Instance variables always start with @ 

end 

name에 대한 인스턴스 메서드를 만듭니다 클래스는 같을 것이다. attr_accessorModule 클래스의 메소드입니다.

루비에서는 클래스 시작 부분에 인스턴스 변수를 정의 할 필요가 없습니다 (Java, C++ 외 다른 언어에서와 마찬가지로). 따라서 생성자에서 심볼에서 인스턴스 변수로 변경해야합니다.

def initialize(name) 
    @name = name 
end 
관련 문제