首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不理解如何在不使用{} curly块的情况下解析多行语句。

不理解如何在不使用{} curly块的情况下解析多行语句。
EN

Stack Overflow用户
提问于 2012-03-23 18:05:22
回答 4查看 3.5K关注 0票数 1

我遵循C家族(PHP是一个想要的!)要求跨越多行的语句必须用曲线括起来。

Scala避免了O‘’Reilly的Scala编程中这段代码中的解析错误。

代码语言:javascript
运行
复制
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
  }

虽然我认为它应该看起来像(功能的主体被附在一起):

代码语言:javascript
运行
复制
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可以解析它,但是程序员能“得到”吗?我不想。我是不是漏掉了一些直观的想法?

如果这样做会导致实际问题(比如可读性差),我应该避免这样的做法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-23 18:52:53

在Scala中,更多的东西(包括ifmatch和带有yieldfor )返回的结果与其他语言一样。而且更多的数据结构是不变的,这常常导致mapfilterflatMapcollect等的转换链--这也只能给出一个结果。最后但并非最不重要的一点是,Scala对元组有很好的支持,这意味着您通常会将元组作为单个结果返回,而其他语言必须对单个值进行排序。

因此,一般来说,Scala不像其他语言那样处理存储中间值的变量。这意味着函数通常只是一个方程f(a) = b,其中b可能相当复杂,但仍然是一个返回单个结果的链。因此,采用这种语法是很自然的,它立即表明,您不是在玩弄中间结果,而是遵循一种更实用的风格。

应该提到的是,函数语言(除了具有完全不同语法的"lispy“家族之外)有类似的约定。因此,如果您查看Haskell、F#或Erlang,通常不会看到任何用于方法的“块”。有些结构像letcase和(对于Haskell) do,它们看起来可能有点像块,但也是表达式。

票数 3
EN

Stack Overflow用户

发布于 2012-03-23 18:35:01

当您说一个函数=(没有大括号)时,它编译并工作得很好,因为它是一个表达式。您的“匹配”表达式总是计算为一个值。而“匹配”是你功能中唯一的东西。所以,实际上它只是一个表达式,即使它跨越了几行。如果应用函数需要多个表达式和语句,那么是的,您确实需要大括号。

票数 3
EN

Stack Overflow用户

发布于 2012-03-23 19:03:03

您有一个只由一个表达式组成的函数。许多语言仍然需要把它用大括号括起来。

如果您只习惯这类语言,这可能会使您感到困惑。但是,在使用Scala之后,一个函数定义(在主体上只有一个表达式)开始看起来像一个值为“变量”的函数。

从那时起,你就不用再错过花括号了。

所以:在几乎所有的情况下,我都会跳过所有我不需要的牙套。我已经很长一段时间没有问题了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9844328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档