Scala 括号语义

2024-02-26

将值附加到 MAP 时,为什么 Scala 需要额外的括号块才能使该语句起作用?

不编译:

vmap += (item.getName(), item.getString()) // compiler output: "found: String"

但是,这确实可以编译:

vmap += ((item.getName(), item.getString())) // note the second set of enclosures

TIA

编辑:vmap 定义为

val vmap = new mutable.HashMap[String, String]()

结语:在进行本次编辑时,有一些帖子详细介绍了两种可能的解释,这两种解释似乎都包含了对他们来说正确的元素。哪一个实际上是正确的?我不能肯定地说……我只是一个仍在学习语言的人。话虽这么说,我已经根据以下内容更改了答案选择feeling一个答案(至少在某种程度上)包含在另一个答案中 - 所以我选择了更大的图景,因为我认为这将为其他寻求答案的人提供更广泛的意义。讽刺的是,我试图更好地理解如何消除语言中的一些细微差别,而我逐渐意识到这些细微差别比我想象的要多。我并不是说这是一件坏事 - 事实上(IMO)这是可以预期的any语言既灵活又复杂 - 但它确实会让人们时不时地怀念汇编的黑白世界......

为了结束这个问题,有几点观察:
1)所选答案包含一个指向充满 Scala 脑筋急转弯的网站的链接(我发现这对于尝试理解该语言中的一些上述夸克非常有帮助。)强烈推荐。
2)我确实遇到了另一个有趣的转折 - 虽然单括号(上面的示例)不起作用,但将其更改为以下内容并且它工作得很好......

vmap += ("foo" -> "bar")

这可能与匹配方法/函数签名有关,但这只是我的猜测。


接受的答案实际上是错误的。

您没有获得 Map.+= 元组的原因是该方法被带有两个或更多参数的第二个方法重载。

仅当参数数量错误时,编译器才会尝试元组。但是,如果你给它两个参数,并且有一个方法需要两个参数,那么它就会选择它,即使它无法进行类型检查。

在某些东西起作用之前,它不会开始尝试所有可能的组合,因为这会充满晦涩难懂。 (参见隐式。)

scala> def f(p: Pair[String, Int]) = { val (s,i) = p; s.toInt + i }
f: (p: Pair[String,Int])Int

scala> f("2",3)  // ok to tuple
res0: Int = 5

scala> trait F { def +=(p: Pair[String, Int]) = f(p) }
defined trait F

scala> val foo = new F {}
foo: F = $anon$1@6bc77f62

scala> foo += ("2",3)  // ok to tuple
res1: Int = 5

scala> trait G { def +=(p: Pair[String, Int]) = f(p); def +=(p:(String,Int),q:(String,Int),r:(String,Int)*) = f(p)+f(q)+(r map f).sum }
defined trait G

scala> val goo = new G {}
goo: G = $anon$1@183aeac3

scala> goo += ("2",3)    // sorry
<console>:12: error: type mismatch;
 found   : String("2")
 required: (String, Int)
              goo += ("2",3)
                      ^

scala> goo += (("2",3),("4",5),("6",7))
res3: Int = 27

如果我不提你的朋友和我的朋友 -Xlint,那就太失职了,它会警告不良的参数调整:

apm@mara:~/tmp$ skala -Xlint
Welcome to Scala version 2.11.0-20130811-132927-95a4d6e987 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def f(p: Pair[String, Int]) = { val (s,i) = p; s.toInt + i }
f: (p: Pair[String,Int])Int

scala> f("2",3)
<console>:9: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
        signature: f(p: Pair[String,Int]): Int
  given arguments: "2", 3
 after adaptation: f(("2", 3): (String, Int))
              f("2",3)
               ^
res0: Int = 5

scala> List(1).toSet()
<console>:8: warning: Adapting argument list by inserting (): this is unlikely to be what you want.
        signature: GenSetLike.apply(elem: A): Boolean
  given arguments: <none>
 after adaptation: GenSetLike((): Unit)
              List(1).toSet()
                           ^
res3: Boolean = false

关于适应的危险,请参阅自适应推理益智游戏 http://scalapuzzlers.com/#pzzlr-036 and 这个新的很常见 http://scalapuzzlers.com/#pzzlr-040因为我们知道括号的存在或不存在很大程度上是风格问题,当括号确实很重要时,错误地使用它们会导致类型错误。

在存在重载的情况下调整元组:

scala> class Foo {
     | def f[A](a: A) = 1    // A can be (Int,Int,Int)
     | def f[A](a: A, a2: A) = 2
     | }
defined class Foo

scala> val foo = new Foo
foo: Foo = Foo@2645d22d

scala> foo.f(0,0,0)
<console>:10: warning: Adapting argument list by creating a 3-tuple: this may not be what you want.
        signature: Foo.f[A](a: A): Int
  given arguments: 0, 0, 0
 after adaptation: Foo.f((0, 0, 0): (Int, Int, Int))
              foo.f(0,0,0)
                   ^
res9: Int = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 括号语义 的相关文章

  • 如何使用 scala 宏打印变量名称和值?

    我确信有一种更优雅的方式来编写以下宏来打印变量的名称和值 def mprintx c Context linecode c Expr Any c Expr Unit import c universe val namez c enclosi
  • Scala - Java = ? (或者 Clojure - Java = ?)

    开发人员可以在不懂 Java 的情况下使用 Scala 吗 开发人员可以在不懂 Java 的情况下使用 Clojure 吗 注意 例如 我是一名 C 开发人员 我在不了解任何 VB 的情况下使用 NET 当然 WF 4 0 使用 VB 进行
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 如何在 Scala 中编写 Pig UDF

    我正在尝试在 Scala 中编写 Pig UDF 使用 Eclipse 我已将 pig jar 添加为 java 构建路径中的库 这似乎解决了以下 2 个导入问题 导入 org apache pig EvalFunc 导入 org apac
  • Joda Time 类没有任何构造函数...为什么?我做错了什么?

    显然 Eclipse 上的 Scala 试图让我相信DateTime Period DateMidnightJoda Time 中的许多其他类没有任何构造函数 考虑到它们的文档显示了构造函数和许多方法 这很奇怪 我唯一可以访问的是静态方法
  • 如何从spark管道逻辑模型中提取变量权重?

    我目前正在尝试学习 Spark Pipeline Spark 1 6 0 我将数据集 训练和测试 导入为 oas sql DataFrame 对象 执行以下代码后 生成的模型是oas ml tuning CrossValidatorMode
  • 如何设计具有相互依赖的测试的 Specs2 数据库测试?

    有没有一些首选的方法来设计Specs2 http etorreborre github com specs2 测试 有很多测试取决于之前测试的结果 下面 您将找到我当前的测试套件 我不喜欢var位于测试片段之间 不过 它们是 需要的 因为某
  • 清理 IntelliJ 中构建的 Play 框架

    我有一个拼写错误conf routes文件导致 Play Framework 生成错误命名的类 重建项目并运行Invalidate Caches并没有解决 IntelliJ 中的问题 当我手动运行时重新生成了不正确的类文件play clea
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • 如何从字符串列中提取数字?

    我的要求是从列中的评论列中检索订单号comment并且总是开始于R 订单号应作为新列添加到表中 输入数据 code id mode location status comment AS SD 101 Airways hyderabad D
  • IntelliJ IDEA 13:新的 Scala SBT 项目尚未生成 src 目录结构

    我按照 Jetbrains 网站上的入门视频设置 IntelliJ IDEA 13 1 Community Edition 以与 Scala 配合使用 Scala 插件 v0 36 431 已安装 当我使用向导创建一个新的 Scala SB
  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • Scala 2.9 无法在 Windows XP 上运行“hello world”示例

    我正在尝试在 Windows XP 上使用 scala 2 9 1 Final 运行 HelloWorld 示例 object HelloWorld extends App println Hello World 文件另存为Hello sc
  • 模拟 BlazeClientBuilder[IO] 以返回模拟客户端[IO]

    我正在使用BlazeClientBuilder IO resource方法得到Client IO 现在 我想模拟客户端进行单元测试 但不知道该怎么做 有没有一个好的方法来嘲笑这个 我会怎么做 class ExternalCall val r
  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 在scala 2.13中,为什么有时无法显式调用类型类?

    这是 Shapeless 2 3 3 中的一个简单示例 val book author gt gt Benjamin Pierce title gt gt Types and Programming Languages id gt gt 2

随机推荐

  • 创建如果两个表中的行匹配条件则返回 id 的查询

    我正在学习 SQL dbms 并使用 Postgres 我想返回在特定列中都具有特定值的行 例如在表格中Carpets and Curtains 我想得到ids 行 其中颜色为 light yellow 我想我需要加入 但不确定是什么类型
  • 如何在 OpenLayers 5.3.0 中剪切和显示剪切的向量几何

    我必须根据主 限制向量层来剪辑向量层 绘制时 如果绘制图层的某些部分在限制图层之外 则剪掉限制图层之外的区域 示例 1 正如我们所看到的 底部边框的一部分处于限制之外 紫色层 我想知道是否可以向限制层外部的剪辑区域添加功能 示例 2 删除限
  • C 标准数据结构库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 语言 Windows 平台 中经过测试和测试的标准库 它实现了堆栈 队列 树等数据结构
  • 错误:“函数”对象不可下标

    我正在做我的 python 作业 但是当我想测试上面的情况时出现错误 这是我的代码 def evalTerm env t if type t Node for label in t children t label if label Num
  • 安全共享的 Google 日历

    我正在开发一个小型网站 它有一个非常简单的想法 有两组用户 办公室和工人 都必须登录才能访问该网站 该网站是使用Zend框架构建的 问题 我想要一个所有用户都可以访问的日历 办公室工作人员能够编辑日历 而工作人员只能查看日历 我真的很想使用
  • 如何利用MVC中的常用图像资源

    我有几个 ASP NET MVC3 和 4 网站 所有站点都使用独立于库的相同资源 资源是 resx 文件 我想在这些网站内的 html 中使用这些资源中的图像 我之前没有使用过 resx 文件 所以不确定使用它们的好方法是什么 我认为我可
  • 将新节点添加到力导向布局

    关于 Stack Overflow 的第一个问题 请耐心等待 我是 d3 js 的新手 但一直对其他人能够用它完成的事情感到惊讶 并且几乎同样对我自己用它取得的进展如此之少感到惊讶 显然我没有摸到什么 所以我希望这里善良的灵魂可以向我展示光
  • 使用ajax通过单击按钮运行php脚本

    我是一个业余爱好者 对 html javascript php 的了解有限 我设置了一台 Raspberry Pi 微型计算机作为 Web 服务器 首先 我想通过网页上的按钮打开连接到 Pi 的 LED 我有以下有效代码 html 文件的名
  • 手动设置Flutter验证错误

    验证表单并将请求从 flutter 发送到服务器后端后 我想将服务器中的任何潜在错误消息设置为以原始表单显示 最好与验证错误完全相同 例如 Widget build BuildContext context TextFormField on
  • 指针访问和引用访问哪个更快?

    在下面的示例代码中 我分配了 struct Chunk 的一些实例 然后 在 for 循环中 我迭代内存块并使用指针或引用访问不同的实例 并为它们分配一些随机数据 但是哪个 for 循环执行得最快呢 据我所知 我认为引用循环将是最快的 因为
  • 清理 URL 以防止 Rails 中的 XSS

    在 Rails 应用程序中 用户可以创建事件并发布 URL 以链接到外部事件站点 如何清理网址以防止 XSS 链接 提前致谢 XSS 示例 rails 的清理方法无法预防该问题 url javascript alert XSS a href
  • .Net core & SynchronizationContext & Thread.SetData

    据我所知 AspNetCore没有 https blog stephencleary com 2017 03 aspnetcore synchronization context html SynchronizationContext 重新
  • C++0x 中的特殊成员函数

    维基百科文章关于特殊成员函数 http en wikipedia org wiki Special member functions不包含任何对移动构造函数和移动赋值运算符的引用 我想更新该条目 但我不确定 0x 标准的内容 这两个函数的规
  • 将 JSON 数据加载到 Bootstrap 模式中

    我想加载一个 JSON 文件 该文件在 Bootstrap Modal 内创建一个列表 我将其设置为如果您单击某人的图片 则会弹出模式 li class project span3 a class thumbnail img src img
  • 为什么

    我的公司正在构建一个网站 我们遇到了一些 JavaScript 库无法替换某些内容的问题 我们决定将 HTML 放入 W3C 验证器 它告诉我们拥有 div 标签内的 div
  • 异步 - 等待 - 预期线程

    我有以下代码 static void Main string args Run1 Run2 Wait static async Task DoAsyncWork await Task Delay 2000 static async Task
  • H2 控制台在 H2 数据库中抛出错误 webAllowOthers

    我正在使用heroku来部署我的应用程序 当我尝试使用heroku加载我的h2控制台时 它抛出一个错误 H2 控制台 抱歉 此服务器上禁用远程连接 webAllowOthers 我在 application properties 文件中使用
  • 防止 Web 应用程序升级时浏览器缓存

    我有一个非常麻烦的问题 目前还没有找到好的解决方案 我允许浏览器缓存所有应用程序静态文件 JS CSS 和图像 以提高性能 问题是 当我进行升级时 用户仍然使用缓存中的旧版本 这经常会破坏应用程序 并且每次都需要清除缓存才能解决问题 是否有
  • Python:Pandas - 按组删除第一行

    我有以下大型数据框 df 看起来像这样 ID date PRICE 1 10001 19920103 14 500 2 10001 19920106 14 500 3 10001 19920107 14 500 4 10002 199201
  • Scala 括号语义

    将值附加到 MAP 时 为什么 Scala 需要额外的括号块才能使该语句起作用 不编译 vmap item getName item getString compiler output found String 但是 这确实可以编译 vma