【问题标题】:Need help to customize a class attribute in ruby?需要帮助自定义 ruby​​ 中的类属性?
【发布时间】:2013-07-02 07:14:20
【问题描述】:

我正在尝试创建一个具有 1 个属性的 Book 类:title,如果以小写形式输入,则必须大写。我的代码在 repl.it 中工作,但 rspec 仍然显示 NoMethodError (undefined method 'title' for #(Book.... @title="Inferno") 我的代码:

class Book
    def initialize(title=nil)
        @title = title
    end
    def title=(new_title)
        title = new_title.capitalize!

    end

end

Rspec:

require 'book'

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

谢谢。

【问题讨论】:

    标签: ruby class methods rspec attributes


    【解决方案1】:

    试试这个。

    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
    

    【讨论】:

      【解决方案2】:
      class Book
        def initialize(title=nil)
          @title = title
        end
      
        def title=(new_title)
          title = new_title.capitalize!
          puts title
          puts @title
        end
      
        def title
          @title
        end
      
      end
      
      b = Book.new('hello')
      b.title = 'hello'
      
      --output:--
      Hello
      hello
      

      @title 和 title 是两个不同的变量。

      【讨论】:

      • 它有效,谢谢,但你能解释一下为什么我需要再定义标题 1 次吗?
      • title=() 方法允许您设置@title 实例变量。 title() 方法允许您检索@title 实例变量,您可能希望也可能不希望允许。通常,title=()title() 都是必需的。
      • 我明白了。非常感谢。
      • >>"@title和title是两个不同的变量"我以为@title是变量,title是输入值。
      • “输入值”是什么意思?如果您指的是方法的参数变量,则在代码中将参数变量命名为new_title。每当您在方法中写入var_name = .... 时,都会创建一个新变量var_name,该变量将在方法结束时被销毁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多