需要解释一些Ruby语法

时间:2011-06-06 04:22:44

标签: ruby symbols

我是ruby on rails的新手,任何人都可以解释符号':'是什么意思,什么是'validates'和'create_table'?这么多困惑......

class Post < ActiveRecord::Base
   validates :name, :presence => true
   validates :title, :presence => true, :length => {:minimum => 5}
end

class CreatePosts < ActiveRecord::Migration
   def change
     create_table :posts do |t|
       t.string :name
       t.string :title
       t.text :content
       t.timestamps
     end
    end
 end

8 个答案:

答案 0 :(得分:6)

  1. 冒号字符(:)是Ruby“符号”的语法文字的开头:

    :abc.class # => Symbol
    "abc".to_sym # => :abc

    符号就像字符串,但它们是“实习”,这意味着Ruby解释器在内存中只有一个副本,尽管存在多个可能的引用(而在内存中可能同时存在许多等效的字符串)。

    < / LI>
  2. 上面示例中的“validates”标记是一个类方法(“Post类”的类层次结构中的某个类),使用符号参数调用({{1} })和一个哈希参数,其中一个键/值对为:name

  3. ':presence => true'标记是一个使用单个参数(符号“create_table”)调用的方法,并且给出了一个采用单个参数“t”(:posts)。

答案 1 :(得分:1)

在Ruby中,:表示它是一个符号。 Symbol有点像一个轻量级字符串,专门用作标识符。例如,在散列中,您使用符号作为指向其各自值的键。

my_hash = {:key_1 => "A", :key_2 => "B"}

在上面的示例中,您使用符号指定Post模型的属性和posts表的

以下是进一步阅读Ruby符号的一些链接:

答案 2 :(得分:1)

:foo符号,即保证唯一的常量字符串。它们经常在Ruby中用于引用字段或方法。

在ActiveRecord中使用

validates来设置字段值的约束。

validates :name, :presence => true表示必须始终为name的所有实例(以及DB中的相应表)设置字段Post(不为空,未定义或为空)。 validates :title, :presence => true, :length => {:minimum => 5}表示必须始终设置字段title,且其长度必须大于5。

答案 3 :(得分:1)

:foo是一个“符号”,它本质上是一个不可变的字符串。它的主要优点是每次使用它时都不会分配新对象。如果每次需要使用它时都使用字符串“name”,那么每次都会创建一个新的String对象。但是,如果您使用:name,则每次都使用相同的Symbol对象(在指针相等性和对象标识方面相同)。

validates和create_table都是方法。在ruby中,方法在调用时不需要括号,因此验证:foo与validates(:foo)相同。这些方法来自继承和模块mixins。 validates是在继承期间放入ActiveRecord对象的类方法,而create_table是一个实例方法

答案 4 :(得分:1)

Ruby DocumentationRuby on Rails Documentation

“符号:是什么意思?” Class:Symbol

  

Symbol对象表示Ruby解释器中的名称和一些字符串。它们是使用:name和:“string”文字语法以及各种to_sym方法生成的。无论该名称的上下文或含义如何,都将在程序执行期间为给定名称或字符串创建相同的Symbol对象。因此,如果Fred是一个上下文中的常量,另一个中的方法,以及第三个中的类,则Symbol:Fred将在所有三个上下文中都是相同的对象。

“什么是validates?” ActiveModel::Validations::ClassMethods

  

此方法是所有默认验证器和以“Validator”结尾的任何自定义验证程序类的快捷方式。请注意,通过在其位置创建自定义验证程序类(如PresenceValidator),可以在特定类中覆盖Rails默认验证程序。

“什么是create_table?” ActiveRecord::ConnectionAdapters::SchemaStatements

  

创建一个新表

(该链接显示示例,显示此方法生成的SQL语句。)

答案 5 :(得分:0)

@Grimm

正如您应该知道的,一切都是RoR上的对象。在某些情况下,您需要区分String与其他String,因为String的内存处理技术与其他数据结构不同。科隆:是考虑这种类型的一种形式。它们只是在内存中进行哈希输入的符号!
习惯了,它会很有趣! :)

答案 6 :(得分:0)

每个人都说,:是符号的开头。符号对我来说简单是一个字符串或变量名。在您的示例中,:name是一个变量/符号,它反映了Post表中的一个字段名称。创建Model类时,Rails会自动创建这些符号。

在Ruby中,您可以调用方法/函数并使用/不使用括号指定其参数。所以,

  

验证:name,:presence =&gt;真

可以写成

  

验证(:name,:presence =&gt; true)

因此,您实际上已将:nametrue作为validates方法

的参数传递

希望这有助于您更清楚地了解Ruby中调用的方法。

与验证相同,create_table也是一种方法。

答案 7 :(得分:0)

除了符号之外,这里需要注意的是,在Ruby中,我们不必隐式地给{}指定如果参数是最后一个参数,则参数是哈希。我的意思是打电话给

validates :name, :presence => true
你正在打电话

validates :name, {:presence => true}

validates(:name, {:presence => true})

然后很明显,您正在使用2个参数,符号和哈希调用方法validates。如果我们忽略符号并替换字符串,就像这样:

validates("name", {"presence" => true})

它与任何其他语言的方法调用非常相似。因此,请注意这一点,因为它几乎用在Rails使用的每个帮助程序标记中。

对于其他方法,您也可以看到:

validates(:title, {:presence => true, :length => {:minimum => 5}})

create_table的情况下,它是一个带有2个参数的方法调用,一个符号和一个块。