Ruby on Rails中的冒号位置。

时间:2015-05-19 00:47:23

标签: ruby-on-rails ruby colon

有什么区别:

1)abc:

2):xyz

3)abc :: xyz

4)abc :: xyz

5)abc:xyz

6):abc => XYZ

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

2 个答案:

答案 0 :(得分:5)

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 :(得分: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非常常见。这就是你引用类/模块Xyz的内部类/模块/常量Abc的方式。 ::可以但不应该用于调用类/模块方法。

如果您真的希望看到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}

作为参数,可以省略散列的花括号。并且当散列的键是符号时,冒号可以移动到符号后面,并且可以省略粗箭头=>。这使得哈希看起来更像JSON对象。

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

def my_method(abc: :xyz)
  puts abc
end

5)嗯,它与4)相同,只是散列的值是局部变量或方法调用

6)与5)相同

7)三元运算符

x = true ? 1 : 0