问题标签 [companion-object]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
442 浏览

scala - Scala 特征的伴随对象

我有这样的事情:

我如何在 ListBuffer 中添加这些属性,比如说 like atr,然后像在 TestF 的第三行中那样一次读取它们?

0 投票
0 回答
33 浏览

scala - 将伴随样板封装在注解+宏后面

我正在使用只能在验证步骤之后构建的 ADT(这是 FP 中的常见做法,以确保正确性)。例如,我在 上使用一个Score类型Double,它验证其包装值在 [0.0, 100.0] 内。

所以我有这样的事情:

这是一种解决方法,无法隐藏apply从这个答案https://stackoverflow.com/a/5736428/247623获取的自动生成的案例类伴侣到一个完全不相关的问题。

尽管它在令人满意的程度上工作——除了编译错误ambiguous reference to overloaded definition根本没有帮助——它具有每个 ADT 定义的巨大缺点,一个受保护的构造函数必须显式定义:

我试过使用继承无济于事。

是否有可能使用宏来实现这一点,或者 Scala 宏当前不支持向类/对象添加方法?就像是:

...或类似的。

0 投票
1 回答
338 浏览

scala - 避免 Scala 类和伴生对象中的重复类型别名

我是 Scala 的新手,我有一个带有类和伴随对象的 Scala 程序,我想使用一个使用的类型别名:

  1. 定义类的方法。
  2. 我也想在课堂外使用别名。为此,我发现在伴随对象中定义别名,从伴随对象导入别名很有用。我还在伴生对象中定义了一些隐式,所以这很自然。

具体代码在https://github.com/juanrh/Surus/blob/1cfd55ed49c4d1b22e53babe07bcf44fd74e3072/src/main/scala/org/surus/spark/SurusRDDFunctions.scala,类型别名是 PMMLPrediction,类是 SurusRDDFunctions。目前代码有效,但我已经在类和同伴中定义了别名,这不是很好。如果我删除了类中别名的定义,那么类就找不到它,这看起来很奇怪。所以我想我可能做错了什么,有什么想法吗?

非常感谢您的帮助!

问候,

胡安

0 投票
1 回答
1053 浏览

scala - 在 Scala (Eclipse IDE) 中使用特征和伴随对象时返回值的问题

我已将以下代码放入 Eclipse 中的 object.Scala 文件中,并且只是想知道“x”的值是什么(应该是 3)。如果我将值放在 List 对象之外的任何位置,则代码将无法编译;同时,在 List 对象中,运行文件不会产生任何输出。

我最初将所有内容都放入其中object Work extends App以便编译,否则编译器会抱怨我缺少 Main 方法。但是,为了返回“x”,我尝试放弃 Work 对象,而是将 Main 方法添加到我想要查看的表达式中,如下所示:

但是,然后我收到以下错误:

List 有一个参数类型为 Array[String] 的 main 方法,但 work.List 不是可运行的程序。原因:companion 是一个 trait,这意味着无法生成静态转发器。

我不太确定这意味着什么。我也很困惑如何正确实现 Main 方法。我尝试直接在List对象下添加一个Main方法,封装了List的所有定义和val x,结果比上面的错误还多。我很困惑,仍在网上寻找答案,但到目前为止似乎没有什么能解决我的特定问题。

任何帮助将不胜感激。

以下是我的原始帖子,其中包含更多信息,包括我正在进行的练习的文本。要进行练习,我需要了解表达式的计算方式。正是出于这个原因,我通常在 Scala 工作表中工作,因为我可以在几秒钟内看到我的结果,但是这个特殊的练习涉及使用 trait 和伴随对象,它们的添加对我来说非常复杂,因为我理解它们是如何的在代码中使用,我不知道如何正确实现它们。


原帖


我将以下代码放入 Eclipse IDE 的 Scala Worksheet 中,然后花了大约两个小时尝试不同的方法来制作它

  1. 编译没有错误,并且
  2. 在右侧显示评估结果。

我仍然在(2)中苦苦挣扎。

当我运行上面的代码时,它会输出一个标准错误,指出缺少主要参数。虽然我不太清楚它是如何工作的def main(args: Array[String) {}object some_object extends App {}但我知道它们允许代码实际编译和运行。同时,过去 Scala 工作表从未要求我有 Main 方法,尽管过去我也没有在同一个文件中使用类或特征。我知道我一定错过了什么。

我试过了

  • 用 App 扩展 List 对象
    • 或者在它下面添加一个 def main 参数
  • 为密封特性创建一个名为“类”的对象,并向其添加主要参数
    • 或使用 App 扩展它
  • 创建一个更大的对象“工作表”,然后我将以下所有内容添加到 def main 参数下
    • 或使用 App 扩展“工作表”
  • 在另一个 Eclipse IDE 文件中,创建一个 New Scala Trait,在其中添加 trait 和类代码,然后尝试将其导入到工作表中,意识到伴随对象 List 需要存在于同一个文件中
  • 将上述所有代码放入一个不同的文件中,尝试将该文件导入工作表,并尝试使任何列表操作工作(这里的问题是我实际上不知道 Eclipse IDE 中哪种类型的 Scala 文件下面的代码将属于对象、类或特征

其中一些已经编译,其他没有,但到目前为止,它们都没有导致工作表在右侧产生实际的评估结果。

这是我一直在尝试的需要上面代码的练习,如果我能真正看到我的代码是如何评估的:

让我们尝试实现几个不同的函数来以不同的方式修改列表。您可以将它和我们编写的其他函数放在 List 伴随对象中。

3.2 实现函数tail,用于删除List的第一个元素。请注意,该函数需要恒定的时间。如果 List 为 Nil,您可以在实现中做出哪些不同的选择?我们将在下一章回到这个问题。

来自Scala 中的函数式编程

非常感谢您的宝贵时间。

0 投票
1 回答
95 浏览

scala - 来自其他类型类的隐式 def 类型类

我想为已经具有隐式 Fractional 或 Integral 类型类的每个类型 T 添加一个新的隐式类型类 Divisible。

我写的代码无法编译:

我收到的错误是:

找不到参数 div 的隐式值:core.common.Divisible[Double]

另一方面,如果我将隐式 def 移动到应用程序中,它会编译。

如何帮助编译器在 Divisible 的伴随对象中找到隐式 def?

编辑:这个问题有一个错误。

0 投票
1 回答
107 浏览

scala - Scala 没有为伴生类创建私有构造函数

我是 scala 的新手,并试图理解 scala oops 概念。我创建了一个类:

当我将其编译为

它创建一个私有构造函数。但是当我制作一个伴随对象而不是构造函数成为 public 时,我无法理解这个概念。请清除

这是 MyComp 类的伴随对象的代码

0 投票
1 回答
2808 浏览

scala - 从另一个类访问伴随类变量

我对scala真的很陌生。我正在尝试从类外部访问伴随类变量。如果可能的话,我如何在不创建类的实例的情况下做到这一点。

在以下示例中,我可以从 YotascaleCostProcessing 类中访问 INTERNAL_COST_REQUESTS

当我从另一个包中的另一个类执行 YotascaleCostProcessing.INTERNAL_COST_UPDATES 时,即使存在 YotascaleCostProcessing 的导入,我也会收到错误“未找到:值 YotascaleCostProcessing”。唯一可行的方法是当我这样做时: new YotascaleCostProcessing().YotascaleCostProcessing.INTERNAL_COST_UPDATES

0 投票
1 回答
53 浏览

scala - 伴随类中的应用方法未将输出打印到控制台

我创建了一个带有私有构造器的类 ApplyDemo

我创建了类的伴生对象为

现在我创建了一个主应用程序类:

出于好奇,我在 apply 方法中放了一个 println 语句。但这不叫。我只是想知道为什么不调用 println 。

PS类和同伴都在同一个文件中

谢谢

0 投票
2 回答
357 浏览

scala - 不同顺序的案例类和同伴的隐式解析

通常,我先在同一个文件中写 a case class,然后是同伴object,就在下面。但是当试图implicit在同伴中导入声明时,我不得不切换声明的顺序(显然我不想要)。克服这种情况的推荐做法是什么?

对于具体情况,以下代码不起作用:

但是,如果我在它起作用object FooWorker之前声明。case class FooWorker我正在使用 Scala 2.11.6 和 SBT 进行测试。非常感谢!

0 投票
2 回答
985 浏览

scala - 何时使用伴随对象工厂与 new 关键字

Scala 标准库中的许多类都使用apply()它们的伴生对象作为工厂。这在链接调用时通常很方便,例如List(List(1)). 另一方面,仍然可以使用new( new HashMap[Int, Int]()) 直接创建对象。

那是标准库。现在,在我自己的代码中,哪种方法更好用:伴生工厂还是使用 ? 创建对象new

new关于何时创建伴随对象工厂以及何时使用关键字是否有任何约定?

使用一个比另一个有什么优势?