4

Rails 中不一致的命名约定让我感到困惑。似乎语法无处不在。这里有些例子:

为什么下面的迁移中有逗号?而且,为什么关键字default前面没有冒号?这个default关键字是什么,一个方法,或者一个变量,一个符号?那是什么东西?:

add_column :zombies, :rotting, :boolean, default: false

这是另一个例子:

为什么age不是:age(带冒号)?为什么在它之前make_rotting加上一个“ :”?

 class Zombie < ActiveRecord::Base
       before_save :make_rotting

   def make_rotting
      if age > 20
         self.rotting = true
      end
    end
 end
4

2 回答 2

8

Ruby 对于 Java 和 PHP 人员来说可能很难。:)

在 Ruby 中,并非一切都是它看起来的样子。以这个为例:

before_save :make_rotting

这是一个方法调用,当然。但这不是make_rotting被调用的方法。这是before_save:make_rotting是它的参数)。这就是 ActiveRecord 中所谓的钩子。before_save将方法名称作为参数,并在时机成熟时动态调用它。

if age > 20

age是一个方法调用,而不是一个符号。它可以写成:

if age() > 20

但括号是可选的。最后:

add_column :zombies, :rotting, :boolean, default: false

这个方法有四个参数,最后一个是哈希。哈希使用新的 Ruby 1.9 语法。以前它会这样写(冒号在正确的位置,以及所有):

add_column :zombies, :rotting, :boolean, :default => false

您应该阅读一本关于 Ruby 编程的好书,而不是从 Stack Overflow 帖子中获取知识。:)

于 2012-10-24T15:50:08.953 回答
3

三个主要的东西:

  1. Ruby 中的方法不需要在其参数周围加上括号。before_saveadd_column是方法,:make_rotting的论点也是如此before_save
  2. 任何以 a 开头的:都是符号。符号就像字符串,但无论您在代码中使用多少次相同的符号,它们只会在内存中分配一次。它们用于很多事情 - 经常作为哈希键。
  3. 将散列作为最后一个参数的 Ruby 方法不需要{}' 围绕散列。

所以这:

add_column :zombies, :rotting, :boolean, default: false

可以改写为:

add_column(:zombies, :rotting, :boolean, {default: false})
于 2012-10-24T15:46:27.613 回答