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
有什么区别:
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