簡體   English   中英

請解釋這個紅寶石代碼(在軌道上)

[英]Please explain this ruby code (in rails)

基本上問題是關於Ruby語法

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

代碼源

我的兩個問題

1個

對我來說,這段代碼validates :name, presence: true看起來像是對方法的調用。

我們如何在類主體內部,任何方法外部調用方法? 我認為這不可能。

2

為什么在這兩個版本中出現錯誤

validates (:name ,  presence: true) #error

要么

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

我已經在方法調用中添加了括號,這是在ruby中允許的。 第一個參數是符號,第二個參數是哈希。

在第一種情況下,我沒有將花括號添加到哈希中,因為我讀到如果最后一個參數是hash,則可以保留花括號。在第二種代碼中,我顯式添加了花括號但仍然出錯。

任何人都可以解釋這種語法。

謝謝

編輯1

失誤

首先我要

product.rb:8:語法錯誤,意外的',',期望的是')'驗證(:name,狀態:true)#錯誤^

在第二我得到

product.rb:10:語法錯誤,意外的',',期望的是')'驗證(:title,{presence:true})#錯誤^

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)

不是有效的表達式,但是解析器嘗試將其作為一個帶括號的參數傳遞給方法。

綜上所述,如果刪除參數和函數名稱之間的空格,則兩個參數列表都是正確的。

第一個問題的答案:“是的,這是一種方法”,這也是第二個問題的答案。

您第二個問題的答案是“刪除驗證和(之間的空格。”當validates (...) ,它將拋出

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

validates是一種方法,如果使用括號,則不能使用空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM