2015-11-02 84 views
0

基本的问题是关于Ruby语法请解释这个Ruby代码(在轨)

class Person < ActiveRecord::Base 
     validates :name, presence: true #no error 
end 

Code Source

我的2个问题

对我来说,这个代码validates :name, presence: true外观类似于调用方法。

我们如何在任何方法之外调用类体内的方法?我认为它不可能在哎呀。

为什么我收到这两个变化

validates (:name , presence: true) #error 

validates (:name , {presence: true}) #error 

我已经添加了括号的方法调用错误,因为它在红宝石允许的。 第一个参数是符号,第二个参数是散列。

在第一种情况下,我没有添加大括号来散列,因为我读过如果最后一个参数是散列,您可以留下大括号,在第二个代码中,我明确添加了大括号但仍然出错。

任何人都可以解释这种语法。

感谢

编辑1

错误

在第一我越来越

product.rb:8:语法错误,意外 '',预计 ')'验证(:name,presence:true)#error^

In其次我越来越

product.rb:10:语法错误,意外 '',预计 ')',用于验证(:标题,{存在:真})#错误^

+0

你得到了什么错误?你知道你在第一个例子中使用':name',第二个是':title',这与它没有任何关系? – harald

+0

是的,只是作出更正 –

+0

在第一种情况下,我收到此错误。“product.rb:8:语法错误,意外',',期待')'瓦利日期(:名称,在场:真)#错误^“ –

回答

3

1:在红宝石定义一个类时,你可以调用的方法:

% irb 
2.2.2 :001 > class Dummy 
2.2.2 :002?> puts "Making a class..." 
2.2.2 :003?> def hello 
2.2.2 :004?>  puts "Hello" 
2.2.2 :005?> end 
2.2.2 :006?> end 
Making a class... 
=> :hello 
2.2.2 :007 > d = Dummy.new 
=> #<Dummy:0x000000009ebbf0> 
2.2.2 :008 > d.hello 
Hello 
=> nil 

所以,这到底发生了什么上。

2:你得到一个错误,因为你有方法的名称和参数列表之间的空间:

% irb 
2.2.3 :001 > def func(*splat) 
2.2.3 :002?> puts splat.inspect 
2.2.3 :003?> end 
=> :func 
2.2.3 :004 > func(:test, :another => :test) 
[:test, {:another=>:test}] 
=> nil 
2.2.3 :005 > func (:test) 
[:test] 
=> nil 
2.2.3 :006 > func (:test, :another => :test) 
SyntaxError: (irb):6: syntax error, unexpected ',', expecting ')' 
func (:test, :another => :test) 
      ^
     from /home/haraldei/.rvm/rubies/ruby-2.2.3/bin/irb:11:in `<main>' 

上面的第二个例子,在那里我只是路过一个ARG的作品,因为你可以用括号括起任何有效的表达式。这与参数列表不一样。所以表达式:

(:test, :another => :test) 

不是一个有效的表达式,但解析器试图将它作为方法的一个圆括号参数传递。

因此,总结一下,如果您删除它们和函数名称之间的空格,则两个参数列表都是正确的。

+0

更具体地说:'(:test,{:another =>:test})'使第二个参数是哈希的事实。 – tadman

2

第一个问题的答案是:“是的,这是一种方法”,这也是第二个问题的答案。

回答你的第二个问题是“删除验证并(之间的空间。”有validates (...)当将抛出

syntax error, unexpected ',', expecting ')' (SyntaxError) 
    validates (:name , presence: true) 

validates是一种方法,如果使用括号,则不能使用空格。