2015-07-11 13 views
1

爲什麼您有時需要使用@引用您的類屬性,並且有時沒有它?如果我刪除'@completed'並替換'completed',則測試失敗。但是在Project類中,任務屬性的設置方式相同,但可以在不使用@的情況下使用。要在Ruby on Rails中使用@還是不要@

class Task 
    attr_accessor :size, :completed 

    def initialize(options = {}) 
    @completed = options[:completed] 
    @size = options[:size] 
    end 

    def completed? 
    @completed 
    end 

    def mark_completed 
    @completed = true 
    end 
end 


class Project 
    attr_accessor :tasks 

    def initialize 
    @tasks = [] 
    end 

    def done? 
    tasks.reject(&:completed?).empty? 
    end 

    def total_size 
    tasks.sum(&:size) 
    end 

    def remaining_size 
    tasks.reject(&:completed?).sum(&:size) 
    end 
end 


describe "estimates" do 
    let (:project) { Project.new } 
    let (:done) { Task.new(size: 2, completed: true) } 
    let(:small_not_done) { Task.new(size: 1) } 
    let(:large_none_done) { Task.new(size: 4) } 

    before(:example) do 
     project.tasks = [done, small_not_done, large_none_done] 
    end 

    it "can calculate total size" do 
     expect(project.total_size).to eq(7) 
    end 

    it "can calculate remaining size" do 
     expect(project.remaining_size).to eq(5) 
    end 
    end 
+1

這是無關緊要的問題,但是我會將'done?'作爲'tasks.all?(&:completed?)'執行。 –

回答

5

attr_accessor :tasks等同於:

def tasks 
    @tasks 
end 

def tasks=(val) 
    @tasks = val 
end 

當你調用tasks,您呼叫的tasks方法,該方法僅返回@tasks變量的值。訪問器方法將始終從類以外的使用(因爲實例變量不可見),但是您可以在類中使用,因爲它們在功能上等同於,用於此任務方法的實現 。但是,如果您可能只是通過返回@tasks之後執行其他操作,則可能需要使用tasks訪問器 - 通過將變量訪問隱藏在方法後面,您將來可以自由地在該訪問器中執行更復雜的工作,而無需更改你使用它的地方。