[英]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.