问题标签 [value-class]

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 投票
1 回答
480 浏览

scala - 隐式值类的优雅分组

我正在为现有的Java库编写一组隐式Scala包装器类(以便我可以装饰该库以使其对Scala开发人员更方便)。

举个简单的例子,假设Java库(我无法修改)有一个类,如下所示:

现在假设我想用Scala风格的 getter 和 setter 来装饰这个类。我可以使用以下隐式类来做到这一点:

implicit关键字告诉Scala编译器它可以将 的实例隐式转换Value为 的实例RichValue(前提是后者在范围内)。所以现在我可以将其中定义的方法应用RichValueValue. 例如:

(同意,这不是很好的代码,也不完全是功能性的。我只是想演示一个简单的用例。)

不幸的是,Scala不允许implicit类是顶级的,因此它们必须在 a 、 或 中定义package object,而object不仅仅是在 a 中。(我不知道为什么这个限制是必要的,但我认为它是为了与隐式转换函数兼容。)classtraitpackage

但是,我也在扩展RichValuefromAnyVal以使其成为value class。如果您不熟悉它们,它们允许Scala编译器进行分配优化。具体来说,编译器并不总是需要创建 的实例RichValue,并且可以直接对值类的构造函数参数进行操作。

换句话说,使用Scala 隐式值类作为包装器几乎没有性能开销,这很好。:-)

但是,值类的一个主要限制是它们不能在 aclass或 a中定义trait;它们只能是packages、package objects 或objects 的成员。(这样他们就不需要维护指向外部类实例的指针。)

隐式值类必须遵守两组约束,因此它只能在 apackage object或 an中定义object

这就是问题所在。我要包装的库包含具有大量类和接口的深层包层次结构。理想情况下,我希望能够使用单个import语句导入我的包装类,例如:

使使用它们尽可能简单。

我目前看到的实现这一点的唯一方法是将所有隐式值类定义放在单个源文件中 的单个package object(或)中:object

然而,这远非理想,我更愿意镜像目标库的包结构,但仍然通过单个import语句将所有内容纳入范围。

有没有一种直接的方法来实现这一点,而不会牺牲这种方法的任何好处?

(例如,我知道如果我放弃使这些包装器值类,那么我可以在许多不同的 s 中定义它们trait- 每个组件包一个 - 并让我的根package object扩展所有这些,通过单个将所有内容带入范围导入,但我不想为了方便而牺牲性能。)

0 投票
1 回答
161 浏览

c++ - 资源代理类... C++ 最佳实践

我有一个常见的问题是为 C 库编写 C++ 包装器……我的主要存储是一个 C-Struct 指针,它始终表示一个 C++ 类,其中只包含一个数据文件。

创建所有的构造函数、静态函数和方法函数没问题……我的设计问题是现在……我应该使用类设计还是指针类设计。

类总是返回对象而不是指针:

类在MyStructSMyClassC之间具有ONE to MANY关系

类的析构函数从不释放struct MyStructS 指针并且大部分为空

的析构函数是静态方法,主要称为destrydelete

类也是方法的参数

还有一个问题:

如何为类参数创建默认参数?

指针类总是返回对象的指针:

指针类在MyStructSMyClassC之间具有一对一关系

指针类的析构函数总是释放struct MyStructS 指针

0 投票
0 回答
788 浏览

scala - 结构细化中的结果类型可能不引用用户定义的值类

当我将 Wrapper 定义为值类(扩展 AnyVal)时:

我对 wrapperHolder 有以下编译错误:

  • 为什么它不适用于价值类?
0 投票
1 回答
111 浏览

scala - 有效地将 AnyVal 案例类 (Seq[T <: AnyVal]) 的序列转换为其运行时表示

假设我有一个价值案例类

以及包含此值案例类的序列

有没有一种方法可以将这些值转换为Int不需要对序列进行迭代的方法(例如,通过Seq(Id(1), Id(2), Id(3)).map(_.i)?

我问的原因是我认为值案例类的好处是您可以在运行时使用具有本机类型的值类作为表示,因此非常有效。但并非所有正在使用的库都支持这些类的自动“转换”。因此,当它是一个简单的属性时,必须传递本机类型,这没什么大不了的,因为编译器可以对其进行优化。但是当有一个序列时,我必须显式地映射它,这意味着对所有值都会发生不必要的迭代,因为它实际上除了在运行时映射到相同的值之外什么都不做。有没有办法避免这种情况并在这种情况下使用编译器的一些优化?

0 投票
0 回答
127 浏览

scala - 作为结构类型成员的值类

这是简化的代码:

错误:结构细化中的结果类型可能未引用用户定义的值类

val y = 新 { val f: 值 = v }

我不明白。既然 Int 也是一个值类,为什么 Int 可以用作成员,但我的值类 Value 不能?为什么 scala 定义了这个限制?如何在结构类型中使用用户定义的值 vlass?

0 投票
2 回答
175 浏览

matlab - 在 Matlab 中为值类对象执行析构函数

我需要控制 Matlab 中值类对象的破坏。问题如下。

我有一个程序(让我们称之为MyProg),它在执行期间创建了一个值类对象(让我们称之为MyValClass)。MyValClass有一个句柄类对象作为它的属性之一(让我们称之为MyHandClass)。该句柄类启动一些MyProg侦听的事件。

出现的问题是MyValClass对象被破坏(通常发生在异常或用户终止时)。我想,因为仍然有监听器在监听 的事件MyHandClass,所以MyHandClass对象不会被销毁,而是保留在内存中。

我想控制MyValClass对象的销毁,这样我就可以隐式地删除它的MyHandClass属性。是否可以?

0 投票
2 回答
526 浏览

scala - 使用 json4s 序列化可选值类实例时遇到问题

我正在尝试使用 json4s 将具有可选值类字段的案例类序列化为 JSON。到目前为止,我无法正确呈现可选的值类字段(请参阅下面的示例片段)。

我试过json-nativejson-jackson图书馆,结果是一样的。

这是一个简短的独立测试

我正在使用 scala 2.12 和最新json4s-native版本:

0 投票
1 回答
221 浏览

scala - 模拟函数在 Scala 中无法正确返回值类

我需要将函数从任意类型模拟为另一种类型,即。例如具有以下签名String => ValueClass。这就是我的的实现方式:

我正在使用来模拟和以匹配结果:

我想知道,为什么这个测试没有通过并且模拟函数返回未包装的值?

构建.sbt

0 投票
1 回答
184 浏览

java - 我在“com/google/type/LatLng”和“com/google/protobuf/GeneratedMessage”之间存在类型不匹配,不知道为什么

我正在尝试从 Long 类型甚至 Integer 获取 Value 类类型(来自 google.datastore.v1),但似乎无法这样做。

这是似乎不情愿的代码部分

运行时,此代码生成以下错误:

我似乎无法弄清楚为什么会产生这个错误以及我必须做些什么来修复它,欢迎任何帮助

0 投票
2 回答
249 浏览

android - 带有kotlin值类的android房间?

我正在尝试使用具有值类的房间实体:

和实体:

我收到以下错误:

甚至可以使用价值等级的房间吗?我找不到任何关于此的内容。谢谢