【问题标题】:Ruby: differences between () and [] in method parametersRuby:方法参数中()和[]之间的区别
【发布时间】:2021-07-08 17:41:49
【问题描述】:

我正在使用 rspec 来测试哈希是否包含键。

response_data = JSON.parse(response.body)['data']
expect(response_data).to have_key('store_id')
expect(response_data).to have_key('store_name')

但意外的是,我用方括号代替了圆括号:

response_data = JSON.parse(response.body)['data']
expect(response_data).to have_key['store_id']
expect(response_data).to have_key['store_name']

返回以下错误:

NoMethodError: 未定义的方法`[]'

Ruby 不会抛出不正确的语法异常,而是抛出 undefined method 异常。

那么 ruby​​ 是如何理解带方括号的方法的呢?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    当你在 ruby​​ 中调用一个方法时,你使用()。有时您可以在特定对象上使用 [] 并且它可以工作,但这只是因为该对象的类型在其定义中定义了 [] 方法。比如

    class Foo
      def [](key)
        key
      end
    end
    
    # and later you can call:
    
    foo = Foo.new
    foo['anything']
    

    【讨论】:

    • 值得注意的是,可以使用方括号调用 lambdas、Methods 和其他可调用对象,例如:x = -> { ... }; x[]m = 11.method(:to_s); m[16]
    【解决方案2】:

    这是语法糖。 [][]= 是为 Array、Hash 和其他类定义的方法。 给定a 一个数组,我想

    a[0] = 5
    

    相同
    a.[]=(0, 5)
    

    我在 irb 中试过,它有效:)

    【讨论】:

    【解决方案3】:

    通常圆括号用于指定参数,方括号用于索引

    例子:

    def is_a_method(a, b)
    end
    
    is_a_method(1,2)
    
    is_a_hash = { a: 1, b: 2 }
    is_a_hash[:a]
    

    它们不可互换。就像编程中的很多事情一样,确切的字符很重要。

    这些东西可以叠加组合:

    JSON.parse(response.body)['data']
    

    JSON.parse(...) 方法调用的结果在本例中是一个 Hash 数据结构。调用 ['data'] 会从该结构中提取一个元素。

    在许多情况下,圆括号是可选的,但在某些情况下,为了清楚起见,最好将它们包括在内。例如,您可以这样表达:

    body = JSON.parse response.body
    body['data']
    

    方括号不是可选的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2017-07-23
      • 2013-01-04
      • 2021-01-11
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多