Crystal 是一门编译型的面向对象编程语言。 以下是这门语言的部分设计目标:
受 Ruby 启发的语法。
静态类型检查,但无需指定变量或方法实参的类型。
可以通过在 Crystal 中编写绑定来调用 C 代码。
具备编译期的代码求值与代码生成能力,以避免样板代码。
编译为高效的原生代码。
Crystal 的开发始于 2011 年,目标是创造一门兼具 Ruby 的优雅与生产力、又拥有编译型语言的性能与类型安全的语言。 这门语言的编译器最初用 Ruby 编写,但在 2013 年用 Crystal 重写。 Ary Borenszweig、Juan Wajnerman 和 Brian Cardiff 开发并设计了这门语言。
要声明一个变量,使用=赋值运算符。
在 Crystal 中,变量应使用 snake_case 格式。
number = 1
puts number # => 1
number = 2
puts number # => 2
常量也使用同样的=赋值运算符声明,但名称全部使用大写字母,也就是 SCREAMING_SNAKE_CASE。
NUMBER = 1
puts NUMBER # => 1
给已定义的常量赋值会导致编译期错误。
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal 是一门编译型语言,这意味着每个变量或方法实参都会在编译期被赋予一个类型。 编译器能够推断变量或方法实参的类型。 不过,在某些情况下,仍然需要指定类型。 需要指定类型的情况会在后续概念中讲解。
方法是一种把一组可复用的指令组织在一起的方式。
在 Crystal 中,方法通常定义在类、模块或结构体中。
不过,方法也可以定义在类、模块或结构体之外。
方法使用def关键字声明,后面跟上方法名。
在 Crystal 中,方法名应使用 snake_case 编写。
当方法没有任何实参时,可以省略括号。
要表示方法的结束,必须使用end关键字。
def hello
puts "Hello World!"
end
对某个类型的变量或方法实参调用不存在的方法,会导致编译期错误。
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
方法可以有实参。 实参是传递给方法的数据。 要给方法传入实参,你必须指定实参的名字。 在 Crystal 中,实参名应使用 snake_case 编写。 一个方法可以有多个实参,但实参之间必须用逗号分隔。
def hello(name)
puts "Hello #{name}!"
end
方法也可以有多个实参。 此时,实参之间必须用逗号分隔。
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
调用属于类、模块或结构体的方法时,必须使用点运算符(.)。
格式应为:<ClassName>.<method_name>。
如果方法不属于任何类、模块或结构体,直接写出它的名字就可以调用。
方法总是隐式返回最后一个表达式的值。
当方法带有实参时,你可以在方法调用和定义中指定实参时使用括号,如下所示:<method_name>(<argument_1>, <argument_2>, ...)。
当方法没有实参时,应省略括号。
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
调用带有多个实参的方法时,实参之间应用逗号分隔。 实参必须按照方法实参的顺序给出。
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
调用方法时传入的实参数量不对,会导致编译期错误。
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
在 Crystal 中,可以用+运算符把两个数字相加。
也可以用-运算符把两个数字相减。
还可以用*运算符把两个数字相乘。
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
在 Crystal 中,注释以#字符开头,后面跟一个空格,然后是注释内容。
注释用于说明代码。
编译器不会执行注释。
# This is a comment