2013-09-03 1 views
1

현재 rspec 튜토리얼을 진행하고 있으며 테스트를 읽는 데 어려움이 있습니다. 내가 읽은하려고 현재 테스트입니다 : 나는 어떻게 나 한테 물어 무엇 이해할 수ruby ​​: 클래스를 이해하고 변수를 정의하는 데 문제가 있습니다. @

describe Book do 

    before do 
    @book = Book.new 
    end 

    describe 'title' do 
    it 'should capitalize the first letter' do 
     @book.title = "inferno" 
     @book.title.should == "Inferno" 
    end 

: 클래스 예약 및 활용하기 위해 클래스 내부의 방법을 만들 수 있습니다. 작업 결국

class Book 
    def initialize(book) 
     @book = book 
    end 

    def title(@book) 
     @book.capitalize 
    end 
end 

솔루션 : 그러나 이것은 완전히 잘못 코딩하는 방법에 대한 나의 생각은 내가해야 할 노력은 무엇

(I는이 경우에 작동하는 코드의 예를 보았다)

class Book 

    attr_reader :title 

    def initialize(title=nil) 
     @title = title && title.capitalize! 
    end 

    def title=(new_title) 
     @title = new_title && new_title.capitalize! 
    end 
end 

나는 @가 무엇을하는지 정확히 이해하지 못합니다. 전체 클래스에서 작동하는 변수를 만드는 것이라고 생각했습니다. 또한 @title이 @book (rspec 테스트에서 지정됨) 대신 사용되는 이유가 궁금합니다.

또한, 나는 코드의 "이전 할"부분 고군분투하고 @book를 요구하는 이유 =

Book.new

는 또한 & &와 부분뿐만 아니라 혼동된다. 왜 @title = title.capitalize를 넣는 것이 좋지 않은가!

내가이 게시물이 길다는 것을 알고 있다면 이해가되지 않는다면이 사실을 분명히 밝혀 낼 수 있습니다.

+0

여기서'capitalize'의 느낌표가 아닌 버전을 사용합니다. 느낌표로 표시된 버전은 전달 된 인수를 수정하여 이상한 버그를 유발할 수 있습니다 :'title = "hello"; book = Book.new (title); title # => "Hello"' – hdgarrood

+0

또한, 제안 사항 : 클래스, 메시지 및 인스턴스 변수에 대해 머리 숙여지기 전까지는 rspec에 대해 걱정할 필요가 없습니다. – hdgarrood

+0

@hdgarrood 현재 rspec 튜토리얼을 통해 루비를 배우고 있습니다. 필자는 독서 과제를 할당했으며 그들이 수행하기를 원하는 코딩은 Test First 튜토리얼입니다. –

답변

2

@는 Ruby의 기본 구성입니다 : 클래스의 인스턴스 변수. 따라서 클래스의 메서드 내에서 매개 변수로 전달할 필요가 없습니다. 클래스의 전체 인스턴스에서 알 수 있습니다. 예를 들어, Instance Variables and Accessors을 참조하십시오. 첫 번째 nil 사실인지 아닌지

def title(@book) 
    @book.capitalize 
end 

&&에만 두 번째 문으로 이동합니다 : 당신이 방법을 매개 변수로 인스턴스 변수를 전달하지 않기 때문에

그래서 다음은 정말 유효하지 않습니다. titlenil가 아닌 예를 들어

def initialize(title=nil) 
    @title = title && title.capitalize! 
end 

는 한 매개 변수 title.capitalize!@title 변수 클래스의 인스턴스를 설정합니다. titlenil 인 경우 @titletitle (즉, nil)으로 설정됩니다. 따라서 클래스가 매개 변수없이 생성 된 경우 @titlenil으로 설정되고 capitalize! 메서드로 nil을 호출하면 오류가 생성되지 않습니다.

+0

'@title = title && title.capitalize! '라고 쓰여있다 : 제목이 있다면 대문자로 표기한다. 그렇지 않다면'title = nil' 첫 번째 제목이 없다면 실패하고 제목이 없다면 통과하지 못했습니까? '@ book' 대신'@title'을 사용하는 이유도 중요합니까? –

+0

@SaiDandamudi, 네,'title '이'nil' 인 경우'@ title'을'title'으로 설정합니다. 'nil' 객체에서'.capitalize! '를 호출하려고 했으므로 첫 번째'title'이 없으면'title'이'nil'이되면 실패하고 실패 할 것입니다. '@ book' 또는'@ title'은 클래스 사용이 일관성이있는 한 중요하지 않습니다. – lurker

+0

나는 본다; 나는 @title이 무엇을하는지에 기초하여보다 깨끗하다고 ​​가정하고있다. 그러면 rspec 테스트에서'@book = Book.new'를 호출하는 시점은 무엇입니까? 이것은 정말로 나를 혼란스럽게 만든다. 나는'@ book'이라는 이름으로 인스턴스 변수를 생성 해달라고 요청한 것이고, 호출 될 때'class Book'에 대한 새로운 객체를 생성 할 것이라고 생각했습니다. –

관련 문제