我遵循C家族(PHP是一个想要的!)要求跨越多行的语句必须用曲线括起来。
Scala避免了O‘’Reilly的Scala编程中这段代码中的解析错误。
def apply(specification: String): Option[Widget] = specification match {
case ButtonExtractorRE(label) => new Some(new Button(label))
case TextFieldExtractorRE(text) => new Some(new TextField(text))
case _ => None
}虽然我认为它应该看起来像(功能的主体被附在一起):
def apply(specification: String): Option[Widget] = {
specification match {
case ButtonExtractorRE(label) => new Some(new Button(label))
case TextFieldExtractorRE(text) => new Some(new TextField(text))
case _ => None
}
}虽然Scala可以解析它,但是程序员能“得到”吗?我不想。我是不是漏掉了一些直观的想法?
如果这样做会导致实际问题(比如可读性差),我应该避免这样的做法吗?
发布于 2012-03-23 18:52:53
在Scala中,更多的东西(包括if、match和带有yield的for )返回的结果与其他语言一样。而且更多的数据结构是不变的,这常常导致map、filter、flatMap、collect等的转换链--这也只能给出一个结果。最后但并非最不重要的一点是,Scala对元组有很好的支持,这意味着您通常会将元组作为单个结果返回,而其他语言必须对单个值进行排序。
因此,一般来说,Scala不像其他语言那样处理存储中间值的变量。这意味着函数通常只是一个方程f(a) = b,其中b可能相当复杂,但仍然是一个返回单个结果的链。因此,采用这种语法是很自然的,它立即表明,您不是在玩弄中间结果,而是遵循一种更实用的风格。
应该提到的是,函数语言(除了具有完全不同语法的"lispy“家族之外)有类似的约定。因此,如果您查看Haskell、F#或Erlang,通常不会看到任何用于方法的“块”。有些结构像let、case和(对于Haskell) do,它们看起来可能有点像块,但也是表达式。
发布于 2012-03-23 18:35:01
当您说一个函数=(没有大括号)时,它编译并工作得很好,因为它是一个表达式。您的“匹配”表达式总是计算为一个值。而“匹配”是你功能中唯一的东西。所以,实际上它只是一个表达式,即使它跨越了几行。如果应用函数需要多个表达式和语句,那么是的,您确实需要大括号。
发布于 2012-03-23 19:03:03
您有一个只由一个表达式组成的函数。许多语言仍然需要把它用大括号括起来。
如果您只习惯这类语言,这可能会使您感到困惑。但是,在使用Scala之后,一个函数定义(在主体上只有一个表达式)开始看起来像一个值为“变量”的函数。
从那时起,你就不用再错过花括号了。
所以:在几乎所有的情况下,我都会跳过所有我不需要的牙套。我已经很长一段时间没有问题了。
https://stackoverflow.com/questions/9844328
复制相似问题