有什么区别:
1)abc:
2):xyz
3)abc :: xyz
4)abc :: xyz
5)abc:xyz
6):abc => XYZ
如果我错过了任何一个,请发帖。
答案 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