2016-08-03 62 views
0

我正在使用rspec来测试散列是否包含密钥。Ruby:方法参数中()和[]之间的区别

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

但由于错误,我从正常parenthese改为方形parenthese:

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

这tooks我很长一段时间的调试错误:

NoMethodError: undefined method `[]'

我的问题是:红宝石不会抛出关于这个语法的异常是错误的,但关于undefined method的例外,所以我很好奇红宝石如何理解与方括号的方法。

感谢

回答

3
当你调用在Ruby中,你使用 ()的方法

。有时你可以在特定的对象上使用[],它可以工作,但只是因为这个对象的类型在其定义中定义了[]方法。例如

class Foo 
    def [](key) 
    key 
    end 
end 

# and later you can call: 

foo = Foo.new 
foo['anything'] 
0

一般圆括号用于指定参数和方括号是索引事情。

例子:

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(...)方法调用的结果是,在这种情况下,哈希数据结构。调用['data']就可以从该结构中抽出一个元素。

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

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

方括号不是可选的。

2

这是句法糖。 [][]=是为Array,Hash和其他类定义的方法。 鉴于a阵列,我认为

a[0] = 5 

是我在IRB尝试同样的

a.[]=(0, 5) 

,它工作:)

+0

澄清,'[]'和'[] = '实际上是'Array'上的两个独立方法,请查看http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D和http://ruby-doc.org /core-2.2.0/Array.html#method-i-5B-5D-3D分别为 – photoionized

+0

是的,当然,但好点。我会添加此信息:) – Ursus

相关问题