这是一个变量,一个符号,一个方法,为什么这有一个冒号而不是?

use*_*087 4 ruby ruby-on-rails

Rails中不一致的命名约定使我感到困惑.似乎语法遍布整个地方.这里有些例子:

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

add_column :zombies, :rotting, :boolean, default: false
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:

为什么age:age(带冒号)?为什么之前make_rotting用" :" 打电话?

 class Zombie < ActiveRecord::Base
       before_save :make_rotting

   def make_rotting
      if age > 20
         self.rotting = true
      end
    end
 end
Run Code Online (Sandbox Code Playgroud)

Ser*_*sev 8

对于Java和PHP人来说,Ruby可能很难.:)

在Ruby中,并非所有内容都是它看起来的样子.以此为例,例如:

before_save :make_rotting
Run Code Online (Sandbox Code Playgroud)

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

if age > 20
Run Code Online (Sandbox Code Playgroud)

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

if age() > 20
Run Code Online (Sandbox Code Playgroud)

但括号是可选的.最后:

add_column :zombies, :rotting, :boolean, default: false
Run Code Online (Sandbox Code Playgroud)

此方法有四个参数,最后一个是散列.哈希使用新的Ruby 1.9语法.以前它会像这样写(冒号在正确的地方,所有):

add_column :zombies, :rotting, :boolean, :default => false
Run Code Online (Sandbox Code Playgroud)

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