问题标签 [implicit-conversion]

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 投票
2 回答
725 浏览

scala - 我可以用具有很好变体类型的 TraversableLike.map 的类似物“拉皮条我的图书馆”吗?

假设我想向mapScala添加类似的功能List,类似于list mapmap f,它将函数应用于两次f的每个元素。list(一个更严重的例子可能是实现一个并行或分布式地图,但我不想被那个方向的细节分散注意力。)

我的第一种方法是

这现在很好用

当然,它只适用于Lists,我们没有理由不希望它适用于任何东西Traverseable,具有map函数,例如Sets 或Streams。所以第二次尝试看起来像

但是现在,当然,结果不能分配给 a List[A]

有没有中间立场?我可以编写一个隐式转换,将方法添加到 Traversable 的所有子类,并成功返回该类型的对象吗?

(我猜这涉及理解可怕的CanBuildFrom特征,甚至可能breakout!)

0 投票
4 回答
173 浏览

c# - 如何允许我的类在 C# 中隐式转换为字符串?

这就是我想做的...

所以我想控制如何 a转换成String……不知何故……

0 投票
3 回答
93 浏览

sql - SQL 中的类型比较

作为 SQL 查询的一部分,我有以下代码:

只要@SortValue是整数、(LabelId也是 int)或由分隔符分隔的整数(例如,SortValue 420|421| 与 420 和 421 比较),代码就可以正常工作。但是,我正在添加涉及非整数值的功能@sortValue。例如:420|ABC|421| 应该与 420、ABC 和 421 进行比较。

不用担心,我想。我将修改该查询的最后一行!

不幸的是,每当我输入@sortValue其中的字符时,都会出现错误。它从未到达过远方or

经过一番折腾,我终于确定 SQL 正在将 StringSplitter 函数的字符串结果转换为与 LabelId 进行比较。当字符串结果被保证只包含数字字符时没有问题,但是 SQL 拒绝将非数字字符串强制转换(可以理解)为 int,从而抛出错误。

在保持所需功能的同时解决此错误的最简单方法是什么?由于数据库交互,我不确定更改类型是否LabelId是一个可行的选择。

0 投票
1 回答
381 浏览

scala - scala 2.8 中的隐式转换问题

我想写一个 Tuple2[A,B] 到 Seq[C] 的隐式转换,其中 C 是 A 和 B 的超类型。我的第一次尝试如下:

但它不起作用:

虽然这个有效:

用例:

我不知道为什么第一个解决方案没有按预期工作。 Scala 版本 2.8.0.r22634-b20100728020027(Java HotSpot(TM) 客户端 VM,Java 1.6.0_20)。

0 投票
4 回答
9051 浏览

c++ - const_cast 与 static_cast

要添加const到非常量对象,首选方法是什么?const_cast<T>static_cast<T>。在最近的一个问题中,有人提到他们更喜欢使用static_cast,但我认为这const_cast会使代码的意图更加清晰。那么使用static_cast变量 const 的论据是什么?

0 投票
4 回答
1516 浏览

c# - C# 中的隐式变量赋值示例

我注意到你可以在 C# 中做这样的事情:

请注意,字符串值被隐式转换为不同的类型。还有其他地方可以做到吗?围绕这类事情有哪些常见的模式和实践?

0 投票
2 回答
1053 浏览

scala - 为什么 scala 中不包含currying 和 uncurrying

如果我有一个功能:

我可以定义一个隐式转换,以便可以在需要函数(A, B) => C的地方使用它。这也朝着另一个方向发展。

为什么这些转换不是隐式的(或隐式可用的)?我假设坏事可能会因某些价值的坏事而发生。这是什么价值?

0 投票
2 回答
887 浏览

scala - Scala:将返回类型转换为自定义特征

我编写了一个扩展 Iterator[A] 的自定义特征,并且我希望能够使用我在从另一个方法返回的 Iterator[A] 上编写的方法。这可能吗?

我仍在努力理解整个隐含的事情,并且不太喜欢在Bar对象定义中编写方法。我将如何包装这样的物品以按照我上面想要的方式工作?

0 投票
1 回答
434 浏览

scala - 在 Scala 中,“println(1,2)”是如何工作的?

在 Scala (2.7.7final) 中,该Predef.println方法被定义为具有以下签名:

怎么会,那么以下工作:

编译器是否会自动将逗号分隔的参数列表转换为元组?用什么魔法?这里是否有隐式转换,如果有,是哪一个?

0 投票
2 回答
498 浏览

c# - 等效隐式运算符:为什么它们是合法的?

更新!

请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了一些东西,因为在看来,我在这个问题中描述的行为实际上违反了规范。

更新2!

好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什么。规范中的“源类型”一词指的是转换的类型——即,Type2在我下面的示例中——这仅仅意味着编译器能够将候选者缩小到定义的两个运算符(因为Type2源类型是对彼此而言)。但是,它不能进一步缩小选择范围。所以规范中的关键词(因为它适用于这个问题)是“源类型”,我之前误解(我认为)它的意思是“声明类型”。


原始问题

假设我定义了这些类型:

然后说我这样做:

显然这是模棱两可的,因为不清楚implicit应该使用哪个运算符。我的问题是——因为我看不到任何解决这种歧义的方法(它不像我可以执行一些显式转换来澄清我想要的版本),但是上面的类定义确实编译——为什么编译器允许那些匹配的implicit运算符?


解剖

好的,我将通过 Hans Passant 引用的 C# 规范的摘录来尝试理解这一点。

找到将考虑用户定义的转换运算符的类型集 D。该集合由 S(如果 S 是类或结构)、S 的基类(如果 S 是类)和 T(如果 T 是类或结构)组成。

我们正在 Type2( S )转换 Type1( T )。因此,这里的D似乎包括示例中的所有三种类型:(Type0因为它是S的基类)、Type1T)和Type2S)。

找到一组适用的用户定义的转换运算符 U。该集合由 D 中的类或结构声明的用户定义的隐式转换运算符组成,它们从包含 S 的类型转换为由 T 包含的类型。如果 U 为空, 转换未定义并发生编译时错误。

好的,我们有两个满足这些条件的运算符。in 声明的版本Type1符合要求,因为Type1它在D中,并且它从Type2(显然包含S)转换为Type1(显然包含在T中)。出于完全相同的原因,in 中的版本Type2 也符合要求。所以U包括这两个运算符。

最后,关于在U中查找运算符的最具体的“源类型” SX

如果 U 中的任何运算符从 S 转换,则 SX 是 S。

现在,U中的两个运算符都从S转换- 所以这告诉我SXS

这不是意味着Type2应该使用该版本吗?

可是等等!我很困惑!

难道我不能定义Type1' 运算符的版本,在这种情况下,唯一剩下的候选者将是Type1' 版本,但根据规范SX将是Type2?这似乎是一种可能的情况,其中规范要求一些不可能的事情(即,Type2应该使用中声明的转换,而实际上它不存在)。