|>运算符称为管道运算符。它可以用来把函数调用串联起来,使前一次函数调用返回的值传给下一次函数调用。
"hello"
|> string.uppercase
|> string.append("?!")
// -> "HELLO?!"
上面的代码等价于下面这段:
string.append(string.uppercase("hello"), "?!")
管道运算符要么把值作为第一个实参传给函数调用,要么把它作为唯一实参传给新的调用,具体取决于哪种做法能得到正确的类型。
100
|> function_that_takes_two_arguments(1)
// Is equivalent to
function_that_takes_two_arguments(100, 1)
100
|> function_that_returns_a_function(1)
// Is equivalent to
function_that_returns_a_function(1)(100)
有时我们想把值传入另一个位置,这时可以使用_占位符来指明该值应插入的位置。
100
|> some_function(1, _, 2)
在这个练习中,你要帮助高中情侣在社交媒体上表白:用他们名字的缩写生成一个 ASCII 爱心:
****** ******
** ** ** **
** ** ** **
** * **
** **
** J. K. + M. B. **
** **
** **
** **
** **
** **
** **
***
*
实现first_letter函数。它接收一个名字并返回其首字母。它应当清理名字中任何多余的空白字符。
first_letter("Jane")
// -> "J"
实现initial函数。它接收一个名字,返回其首字母的大写形式,后面再跟一个点。记得复用上一步中定义的first_letter。
initial("Robert")
// -> "R."
实现initials函数。它接收一个全名,由名和姓组成,两者之间用一个空格分隔,并返回姓名缩写。记得复用上一步中定义的initial。
initials("Lance Green")
// -> "L. G."
实现pair函数。它接收两个全名,返回放在 ASCII 爱心中的姓名缩写。记得复用上一步中定义的initials。
pair("Blake Miller", "Riley Lewis")
// -> "
// ****** ******
// ** ** ** **
// ** ** ** **
// ** * **
// ** **
// ** B. M. + R. L. **
// ** **
// ** **
// ** **
// ** **
// ** **
// ** **
// ***
// *
// "