为什么不调用此属性编写器?

叫声

编码:

class Weird
  DEFAULT_FOO = 'fo0'

  attr_accessor :foo

  def initialize(val)
    @foo = val
  end

  def run
    unless foo
      foo = DEFAULT_FOO         # Fails
      # @foo = DEFAULT_FOO      # Works
    end

    bar(foo)
  end

  def bar(f)
    puts "The foo is '#{f}'"
  end
end

RSpec.describe Weird do
  subject(:weird) do
    described_class.new(foo_val)
  end
  let(:foo_val) { nil }

  describe '#run' do
    context 'without foo' do
      it 'bars the foo' do
        expect(subject).to receive(:bar).with(described_class::DEFAULT_FOO)
        subject.run
      end
    end

    context 'with foo' do
      let(:foo_val) { 'quux' }

      it 'bars the foo' do
        expect(subject).to receive(:bar).with(foo_val)
        subject.run
      end
    end
  end
end

使用RSpec(rspec weird.rb运行此命令,第二项测试失败,并显示以下信息:

  1) Weird#run with foo bars the foo
     Failure/Error: bar(foo)

       #<Weird:0x007fc1948727f8 @foo="quux"> received :bar with unexpected arguments
         expected: ("quux")
              got: (nil)
       Diff:
       @@ -1,2 +1,2 @@
       -["quux"]
       +[nil]

     # ./test_case_2.rb:21:in `run'
     # ./test_case_2.rb:48:in `block (4 levels) in <top (required)>'

foo=()没有调用隐式定义的属性编写器方法;明确定义一个也不起作用。取而代之的是,似乎foo在不应创建的地方设置了方法局部变量为什么会这样呢?

Ruby版本为ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]

列夫塞罗

foo = DEFAULT_FOO失败,因为这将创建一个局部变量foo并为其分配值DEFAULT_FOO但是,当您调用bar(foo)它时,它将首先查找该@值,在这种情况下,该值仍为nil。

分配实例变量时,您必须使用self.foo =@foo =

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不调用此方法就执行?

来自分类Dev

为什么不调用此功能?

来自分类Dev

为什么不调用此函数?

来自分类Dev

为什么不调用此方法就执行?

来自分类Dev

为什么我们在编写装饰器时不调用函数而不是返回它?

来自分类Dev

为什么此泛型函数不调用重写函数

来自分类Dev

为什么此函数不调用move构造函数?

来自分类Dev

为什么Unity Cient不调用服务器命令?

来自分类Dev

为什么不调用UIButton的选择器方法?

来自分类Dev

为什么广播接收器不调用服务

来自分类Dev

两部分:为什么此代码不调用我想要的函数,而无需为此编写单独的函数就可以做到这一点?

来自分类Dev

为什么不调用OnActivate?

来自分类Dev

为什么不调用onBackPressed()?

来自分类Dev

为什么不调用ViewForAnnotation?

来自分类Dev

为什么不调用 componentWillReceiveProps?

来自分类Dev

为什么此方法调用不调用派生类?

来自分类Dev

为什么time()不调用系统调用?

来自分类Dev

如果前面有任何语句,为什么不调用此for循环?(Python 2.7)

来自分类Dev

为什么即使我不调用get()或join(),此CompletableFuture也能正常工作?

来自分类Dev

为什么我的URLDownloadTask不调用didFinishDownloadtingTo?

来自分类Dev

为什么不调用move构造函数?

来自分类Dev

为什么从不调用setOnShowListener?

来自分类Dev

为什么不调用复制构造函数

来自分类Dev

为什么不调用协议功能

来自分类Dev

为什么不调用连接didFailWithError?

来自分类Dev

为什么不调用种子方法?

来自分类Dev

为什么不调用AccountAuthenticator#getAuthToken()?

来自分类Dev

为什么不调用油漆边界?

来自分类Dev

为什么从不调用updatedTransactions?

Related 相关文章

  1. 1

    为什么不调用此方法就执行?

  2. 2

    为什么不调用此功能?

  3. 3

    为什么不调用此函数?

  4. 4

    为什么不调用此方法就执行?

  5. 5

    为什么我们在编写装饰器时不调用函数而不是返回它?

  6. 6

    为什么此泛型函数不调用重写函数

  7. 7

    为什么此函数不调用move构造函数?

  8. 8

    为什么Unity Cient不调用服务器命令?

  9. 9

    为什么不调用UIButton的选择器方法?

  10. 10

    为什么广播接收器不调用服务

  11. 11

    两部分:为什么此代码不调用我想要的函数,而无需为此编写单独的函数就可以做到这一点?

  12. 12

    为什么不调用OnActivate?

  13. 13

    为什么不调用onBackPressed()?

  14. 14

    为什么不调用ViewForAnnotation?

  15. 15

    为什么不调用 componentWillReceiveProps?

  16. 16

    为什么此方法调用不调用派生类?

  17. 17

    为什么time()不调用系统调用?

  18. 18

    如果前面有任何语句,为什么不调用此for循环?(Python 2.7)

  19. 19

    为什么即使我不调用get()或join(),此CompletableFuture也能正常工作?

  20. 20

    为什么我的URLDownloadTask不调用didFinishDownloadtingTo?

  21. 21

    为什么不调用move构造函数?

  22. 22

    为什么从不调用setOnShowListener?

  23. 23

    为什么不调用复制构造函数

  24. 24

    为什么不调用协议功能

  25. 25

    为什么不调用连接didFailWithError?

  26. 26

    为什么不调用种子方法?

  27. 27

    为什么不调用AccountAuthenticator#getAuthToken()?

  28. 28

    为什么不调用油漆边界?

  29. 29

    为什么从不调用updatedTransactions?

热门标签

归档