【问题标题】:Need explanation of some Ruby syntax需要解释一些 Ruby 语法
【发布时间】:2011-06-06 04:22:44
【问题描述】:

我是 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

【问题讨论】:

标签: ruby symbols


【解决方案1】:
  1. 冒号 (:) 是 Ruby“符号”的语法文字的开头:

    :abc.class # => 符号
    "abc".to_sym # => :abc

    符号类似于字符串,但它们是“内部”的,这意味着 Ruby 解释器在内存中只有一个副本,尽管有多个可能的引用(而内存中一次可以有许多等效的字符串)。

  2. 上面示例中的“validates”标记是一个类方法(属于“Post 类”的类层次结构中的某个东西),它使用符号参数 (:name) 和具有单个键/值对 :presence =&gt; true 的 hash 参数。

  3. 1234563 "t" (do |t| ... end)。

【讨论】:

    【解决方案2】:

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

    validates 在 ActiveRecord 中用于设置字段值的约束。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        validates 和 create_table 都是方法。在 ruby​​ 中,方法在调用时不需要括号,因此 validates :foo 与 validates(:foo) 相同。这些方法来自继承和模块混合。 validates是继承过程中放到ActiveRecord对象上的类方法,create_table是实例方法

        【讨论】:

          【解决方案5】:

          Ruby DocumentationRuby on Rails Documentation

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

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

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

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

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

          创建一个新表

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

          【讨论】:

            【解决方案6】:

            @格林

            您应该知道,一切都是 RoR 上的对象。在某些情况下,您需要将 String 与其他数据区分开来,因为 String 的内存处理技术与其他数据结构不同。冒号:是这种类型的一种考虑形式。它们只是像在内存中生成哈希条目的符号一样!
            习惯了,会很有趣的!! :)

            【讨论】:

              【解决方案7】:

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

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

              验证 :name, :presence => true

              可以写成

              验证(:name, :presence => true)

              所以,您实际上将:nametrue 作为validates 方法的参数传递

              希望这可以帮助您更清楚地了解 Ruby 中调用的方法。

              和validates一样,create_table也是一个方法。

              【讨论】:

                【解决方案8】:

                除了符号之外,这里要注意的一点是,在 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 个参数、一个符号和一个块的方法调用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-09-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-27
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多