Rails 上 Ruby 中的冒号位置。

Colon placement in Ruby on Rails.

有什么区别:

1) abc:

2) :xyz

3) abc::xyz

4) abc: :xyz

5) abc: xyz

6) :abc => xyz

如果我错过了任何一个,请post。

1) abc:不能独立存在

2) :xyz 是符号

:xyz.class
 => Symbol

3) abc::xyz 表示命名空间

示例代码:

module ABC
    class Xyz
       def initialize
         @size = 400
       end
    end
end

x = ABC::Xyz.new

4) abc: :xyz

hash = {abc: :xyz} #hash key and value all are symbol. 

5) abc: xyz

xyz = "just a test"
hash = {abc: xyz} #hash key is symbol, value is string. 

6) :abc => xyz

xyz = "just a test"
hash = {:abc => xyz} # same with (5), just another representation

7) 三元运算符:

abc = 1
xyz = 2
result = abc > xyz ? abc : xyz
=> result = 2

1) 不能单独使用abc:。原因见4)。

2) :xyz 是一个 符号 文字。和"xyz"很像,只是:xyz是不可变的,而"xyz"是可变的,而且内存中永远只有一个:xyz(也许这不再是真的了因为Ruby 2.2引入了符号GC?)

:xyz.class  #=> Symbol
:xyz.to_s  #=> "xyz"
"xyz".to_sym  #=> :xyz
a = :xyz
b = :xyz
a.object_id == b.object_id  #=> true

3) abc::xyz很少见,但Abc::Xyz很常见。这就是您引用 class/module Abc 的内部 class/module/constant Xyz 的方式。 :: 可以但不应该用于调用 class/module 方法。

如果你真的想看看abc::xyz的可能用法,那么

abc = Module.new do
  def self.xyz; end
end
abc::xyz  # Call the module method xyz of the anonymous module.

4) Ruby 2.0 之前 abc: :xyz 只能作为传递给方法调用的参数出现。作为参数,这是一个散列或散列的一部分。以下4个表达式相同:

p abc: :xyz, foo: :bar  #=> prints {:abc => :xyz, :foo => :bar}
p(abc: :xyz, foo: :bar)  #=> prints {:abc => :xyz, :foo => :bar}
p({abc: :xyz, foo: :bar})  #=> prints {:abc => :xyz, :foo => :bar}
p({:abc => :xyz, :foo => :bar})  #=> prints {:abc => :xyz, :foo => :bar}

作为参数,散列的花括号可以省略。而当hash的key是symbol时,冒号可以移到symbol后面,粗箭头=>可以省略。这使得散列看起来更像 JSON 个对象。

4.1) Ruby 2.0引入了关键字参数abc: :xyz可以作为参数abc出现,默认值为:xyz

def my_method(abc: :xyz)
  puts abc
end

5)嗯,和4)一样,只不过hash的值是局部变量或者方法调用

6) 同5)

7) 三元运算符

x = true ? 1 : 0