ruby-on-rails - 在 Ruby on Rails 中@或不@

标签 ruby-on-rails ruby rspec

为什么有时必须用 @ 有时不用 @ 来引用您的类属性?如果我要删除“@completed”并替换为“completed”,测试将失败。但是在 Project 类中,tasks 属性的设置方式相同,但可以在没有 @ 的情况下使用。

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

最佳答案

attr_accessor :tasks 等同于:

def tasks
  @tasks
end

def tasks=(val)
  @tasks = val
end

当您调用tasks 时,您正在调用tasks 方法,它只返回@tasks 变量的值。访问器方法总是在类的外部使用(因为实例变量不可见),但您可以在类内使用,因为它们在功能上是等价的这个任务方法的实现。但是,如果您可能除了返回 @tasks 之外还要做其他事情,您可能想要使用 tasks 访问器 - 通过隐藏方法后面的变量访问,您可以自由地 future 可以在该访问器中完成更复杂的工作,而无需更改您使用它的地方。

关于ruby-on-rails - 在 Ruby on Rails 中@或不@,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359424/

相关文章:

ruby-on-rails - 工头开发与生产( rails )

ruby - ruby 中的类变量是什么

ruby - 庆典 : spec: command not found

ruby-on-rails - 在 Rails 中,使用 Mongoid,如何找到具有有效(非零)has_one 引用的所有模型?

javascript animate-ScrollTop 随机工作

jquery - 使用 Rails 3 学习 Ajax 的资源

ruby - 如何在 Ruby 中使用 '~' 指定文件路径?

ruby-on-rails - 在 RSpec 2 中动态生成共享示例?

ruby-on-rails - 创建对象 FactoryGirl 时未定义方法。

ruby-on-rails - 生产中的 rails 和山魈