字面量

字面量用于给一些基础类型赋值

类型示例
Nilnil
Booltrue,false
Integers18, -12, 19_i64, 14_u32,64_u8
Floats1.0, 1.0_f32, 1e10, -0.5
Char'a', '\n', 'あ'
String"foo\tbar", %("あ"), %q(foo #{foo})
Symbol:symbol, :"foo bar"
Array[1, 2, 3], [1, 2, 3] of Int32, %w(one two three)
Array-likeSet{1, 2, 3}
Hash{"foo" => 2}, {} of String => Int32
Hash-likeMyType{"foo" => "bar"}
Range1..9, 1…10, 0..var
Regex/(foo)?bar/, /foo #{foo}/imx, %r(foo/)
Tuple{1, "hello", 'x'}
NamedTuple{name: "Crystal", year: 2011}, {"this is a key": 1}
Proc->(x : Int32, y : Int32) { x + y }
  1. - Nil #代表没有值
  2. nil
  3. - Bool
  4. true,false
  5. - Integers
  6. Int8~ Int64, UInt8~ UInt64 #支持下划线,
  7. 1 #Int32
  8. 1_i8 # Int8
  9. 1_i64 # Int64
  10. 1_u64 # UInt64
  11. 1_000_000 # 1000000
  12. - Floats
  13. 1.0 # Float64
  14. 1.0_f32 # Float32
  15. 1_f32 # Float32
  16. 1_000_000.222_333 # 1000000.222333
  17. - Char
  18. 使用单引号表示
  19. - String
  20. 使用双引号表示
  21. 可以使用#{var}进行变量插值
  22. a, b = 1, 2
  23. "sum: #{a + b }"
  24. 如果不想使用变量插值, 可以 %q(str_val) 来定义
  25. 百分比%, %支持多种边界符(<>,[],(),||)来定义字符串, 这样的好处是当字符串是有“时,不需要转义。
  26. %<my name is "zhukf"> => my name is "zhukf"
  27. 多行字符串
  28. "abc
  29. def" # 这种写法会返回多行字符串 => abc\n def
  30. HereDoc, <<-标志字符串 开始 以开头为标志字符串的行结束
  31. <<-SOME
  32. hello
  33. SOME.upcase # => "HELLO"
  34. def upcase(string)
  35. string.upcase
  36. end
  37. - Symbol
  38. symbol被当成一个不可重复的常量
  39. :hello
  40. :good_bye
  41. - String
  42. [1, 2, 3] # => Array(Int32)
  43. [1, "hello", 'x'] # => Array(Int32 | String | Char)
  44. array_of_int_or_string = [1, 3, 4] of Int32 | String # => Array(Int32 | String)
  45. array_of_int_or_string + ["foo"] # => [1, 2, 3, "foo"]
  46. 空的数组必须要声明类型
  47. [] of Int32 # => Array(Int32).new
  48. 数组类型的字面量 {1,2,344 }
  49. 可以用于任何数据类型,只要它支持 <<方法,并且构造子接受参数
  50. - Hash
  51. {"one" => 1, "two" => 2}
  52. {} of Int32 => Int32 # => Hash(Int32, Int32).new
  53. - Range
  54. x..y # 包含y
  55. x...y # 不包含y
  56. - Regex
  57. 使用 /分割, 并且使用PCRE语法。
  58. foo_or_bar = /foo|bar/
  59. heeello = /h(e+)llo/
  60. integer = /\d+/
  61. - 元组
  62. tuple = {1, "hello", 'x'} # Tuple(Int32, String, Char)
  63. tuple[0] #=> 1 (Int32)
  64. tuple[1] #=> "hello" (String)
  65. tuple[2] #=> 'x' (Char)
  66. - NamedTuple
  67. tuple = {name: "Crystal", year: 2011} # NamedTuple(name: String, year: Int32)
  68. tuple[:name] # => "Crystal" (String)
  69. tuple[:year] # => 2011 (Int32)
  70. - Proc
  71. 可以看作是一个带有上下文的函数入口
  72. # 不带参数的Proc
  73. ->{ 1 } # Proc(Int32)
  74. # 带一个参数的
  75. ->(x : Int32) { x.to_s } # Proc(Int32, String)
  76. # 带两个参数的
  77. ->(x : Int32, y : Int32) { x + y } # Proc(Int32, Int32, Int32)
  78. # 接收一个Int32 并返回一个String类型
  79. Proc(Int32, String)
  80. # 不接收参数也没有返回值
  81. Proc(Void)
  82. # 接收两个参数(Int32和String类型) ,并返回一个Char类型
  83. Proc(Int32, String, Char)
  84. # 调用Proc
  85. proc = ->(x : Int32, y : Int32) { x + y }
  86. proc.call(1, 2) #=> 3
  87. # 调用定义好的方法
  88. def plus_one(x)
  89. x + 1
  90. end
  91. proc = ->plus_one(Int32)
  92. proc.call(41) #=> 42