要声明一个变量,请使用=赋值运算符。
在 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
在这个练习中,你将编写代码,帮助你照着最喜欢的食谱做出一份美味的千层面。
你有四个任务,都与烹制千层面所花的时间有关。
在 Lasagna 类中定义 EXPECTED_MINUTES_IN_OVEN 常量,用来存储千层面应该在烤箱中烤多少分钟。
根据这本食谱,预期的烤箱时间是 40 分钟:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
定义 Lasagna#remaining_minutes_in_oven 方法,它接收千层面已经在烤箱中烤制的实际分钟数作为形参,并根据上一个任务中预期的烤箱时间(分钟)返回千层面还需要在烤箱中烤多少分钟。
Lasagna.new.remaining_minutes_in_oven(30)
# => 10
定义 Lasagna#preparation_time_in_minutes 方法,它接收你为千层面添加的层数作为形参,并返回你准备它所花的分钟数,假设每层需要 2 分钟来准备。
Lasagna.new.preparation_time_in_minutes(2)
# => 4
定义 Lasagna#total_time_in_minutes 方法,它接收两个具名形参:number_of_layers 形参是你为千层面添加的层数,actual_minutes_in_oven 形参是千层面已经在烤箱中烤制的分钟数。
该方法应返回你制作千层面所花费的总分钟数,也就是准备时间(分钟)与千层面此刻已经在烤箱中度过的时间之和。
number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26