请解释这个ruby代码(在rails中)

时间:2015-11-02 18:30:26

标签: ruby-on-rails ruby syntax

基本上问题是关于ruby语法

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

Code Source

我的2个问题

1

对我而言,此代码validates :name, presence: true看起来像是对方法的调用。

如何在任何方法之外调用类体内的方法?我认为它在oops中是不可能的。

2

为什么我在这两种变体中出现错误

validates (:name ,  presence: true) #error

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

我在方法调用中添加了括号,因为它在ruby中是允许的。 第一个参数是符号,第二个参数是哈希。

在第一种情况下,我没有添加花括号来哈希,因为我读到如果最后一个参数是哈希你可以留下花括号,在第二个代码我已经明确添加花括号但仍然有错误。

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

由于

修改1

错误

首先我得到了

product.rb:8:语法错误,意外&#39;,&#39;,期待&#39;)&#39; validates(:name,presence:true)#error ^

第二,我正在

product.rb:10:语法错误,意外&#39;,&#39;,期待&#39;)&#39;验证(:title,{presence:true})#error ^

2 个答案:

答案 0 :(得分:3)

1:在ruby中,可以在定义类时调用方法:

% 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)

不是有效的表达式,但解析器会尝试将其作为一个带括号的参数传递给方法。

总而言之,如果你删除它们之间的空格和函数名,你的参数列表都是正确的。

答案 1 :(得分:2)

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

你的第二个问题的答案是“删除验证之间的空格和(”。当validates (...)时它会抛出

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

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