问题标签 [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.
scala - Scala 特征的伴随对象
我有这样的事情:
我如何在 ListBuffer 中添加这些属性,比如说 like atr
,然后像在 TestF 的第三行中那样一次读取它们?
scala - 将伴随样板封装在注解+宏后面
我正在使用只能在验证步骤之后构建的 ADT(这是 FP 中的常见做法,以确保正确性)。例如,我在 上使用一个Score
类型Double
,它验证其包装值在 [0.0, 100.0] 内。
所以我有这样的事情:
这是一种解决方法,无法隐藏apply
从这个答案https://stackoverflow.com/a/5736428/247623获取的自动生成的案例类伴侣到一个完全不相关的问题。
尽管它在令人满意的程度上工作——除了编译错误ambiguous reference to overloaded definition
根本没有帮助——它具有每个 ADT 定义的巨大缺点,一个受保护的构造函数必须显式定义:
我试过使用继承无济于事。
是否有可能使用宏来实现这一点,或者 Scala 宏当前不支持向类/对象添加方法?就像是:
...或类似的。
scala - 避免 Scala 类和伴生对象中的重复类型别名
我是 Scala 的新手,我有一个带有类和伴随对象的 Scala 程序,我想使用一个使用的类型别名:
- 定义类的方法。
- 我也想在课堂外使用别名。为此,我发现在伴随对象中定义别名,从伴随对象导入别名很有用。我还在伴生对象中定义了一些隐式,所以这很自然。
具体代码在https://github.com/juanrh/Surus/blob/1cfd55ed49c4d1b22e53babe07bcf44fd74e3072/src/main/scala/org/surus/spark/SurusRDDFunctions.scala,类型别名是 PMMLPrediction,类是 SurusRDDFunctions。目前代码有效,但我已经在类和同伴中定义了别名,这不是很好。如果我删除了类中别名的定义,那么类就找不到它,这看起来很奇怪。所以我想我可能做错了什么,有什么想法吗?
非常感谢您的帮助!
问候,
胡安
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 中,然后花了大约两个小时尝试不同的方法来制作它
- 编译没有错误,并且
- 在右侧显示评估结果。
我仍然在(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 - 来自其他类型类的隐式 def 类型类
我想为已经具有隐式 Fractional 或 Integral 类型类的每个类型 T 添加一个新的隐式类型类 Divisible。
我写的代码无法编译:
我收到的错误是:
找不到参数 div 的隐式值:core.common.Divisible[Double]
另一方面,如果我将隐式 def 移动到应用程序中,它会编译。
如何帮助编译器在 Divisible 的伴随对象中找到隐式 def?
编辑:这个问题有一个错误。
scala - Scala 没有为伴生类创建私有构造函数
我是 scala 的新手,并试图理解 scala oops 概念。我创建了一个类:
当我将其编译为
它创建一个私有构造函数。但是当我制作一个伴随对象而不是构造函数成为 public 时,我无法理解这个概念。请清除
这是 MyComp 类的伴随对象的代码
scala - 从另一个类访问伴随类变量
我对scala真的很陌生。我正在尝试从类外部访问伴随类变量。如果可能的话,我如何在不创建类的实例的情况下做到这一点。
在以下示例中,我可以从 YotascaleCostProcessing 类中访问 INTERNAL_COST_REQUESTS
当我从另一个包中的另一个类执行 YotascaleCostProcessing.INTERNAL_COST_UPDATES 时,即使存在 YotascaleCostProcessing 的导入,我也会收到错误“未找到:值 YotascaleCostProcessing”。唯一可行的方法是当我这样做时: new YotascaleCostProcessing().YotascaleCostProcessing.INTERNAL_COST_UPDATES
scala - 伴随类中的应用方法未将输出打印到控制台
我创建了一个带有私有构造器的类 ApplyDemo
我创建了类的伴生对象为
现在我创建了一个主应用程序类:
出于好奇,我在 apply 方法中放了一个 println 语句。但这不叫。我只是想知道为什么不调用 println 。
PS类和同伴都在同一个文件中
谢谢
scala - 不同顺序的案例类和同伴的隐式解析
通常,我先在同一个文件中写 a case class
,然后是同伴object
,就在下面。但是当试图implicit
在同伴中导入声明时,我不得不切换声明的顺序(显然我不想要)。克服这种情况的推荐做法是什么?
对于具体情况,以下代码不起作用:
但是,如果我在它起作用object FooWorker
之前声明。case class FooWorker
我正在使用 Scala 2.11.6 和 SBT 进行测试。非常感谢!
scala - 何时使用伴随对象工厂与 new 关键字
Scala 标准库中的许多类都使用apply()
它们的伴生对象作为工厂。这在链接调用时通常很方便,例如List(List(1))
. 另一方面,仍然可以使用new
( new HashMap[Int, Int]()
) 直接创建对象。
那是标准库。现在,在我自己的代码中,哪种方法更好用:伴生工厂还是使用 ? 创建对象new
?
new
关于何时创建伴随对象工厂以及何时使用关键字是否有任何约定?
使用一个比另一个有什么优势?