问题标签 [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.
scala - 我可以用具有很好变体类型的 TraversableLike.map 的类似物“拉皮条我的图书馆”吗?
假设我想向map
Scala添加类似的功能List
,类似于list mapmap f
,它将函数应用于两次f
的每个元素。list
(一个更严重的例子可能是实现一个并行或分布式地图,但我不想被那个方向的细节分散注意力。)
我的第一种方法是
这现在很好用
当然,它只适用于List
s,我们没有理由不希望它适用于任何东西Traverseable
,具有map
函数,例如Set
s 或Stream
s。所以第二次尝试看起来像
但是现在,当然,结果不能分配给 a List[A]
:
有没有中间立场?我可以编写一个隐式转换,将方法添加到 Traversable 的所有子类,并成功返回该类型的对象吗?
(我猜这涉及理解可怕的CanBuildFrom
特征,甚至可能breakout
!)
c# - 如何允许我的类在 C# 中隐式转换为字符串?
这就是我想做的...
所以我想控制如何 a
转换成String
……不知何故……
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
是一个可行的选择。
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)。
c++ - const_cast 与 static_cast
要添加const
到非常量对象,首选方法是什么?const_cast<T>
或static_cast<T>
。在最近的一个问题中,有人提到他们更喜欢使用static_cast
,但我认为这const_cast
会使代码的意图更加清晰。那么使用static_cast
变量 const 的论据是什么?
c# - C# 中的隐式变量赋值示例
我注意到你可以在 C# 中做这样的事情:
请注意,字符串值被隐式转换为不同的类型。还有其他地方可以做到吗?围绕这类事情有哪些常见的模式和实践?
scala - 为什么 scala 中不包含currying 和 uncurrying
如果我有一个功能:
我可以定义一个隐式转换,以便可以在需要函数(A, B) => C
的地方使用它。这也朝着另一个方向发展。
为什么这些转换不是隐式的(或隐式可用的)?我假设坏事可能会因某些价值的坏事而发生。这是什么价值?
scala - Scala:将返回类型转换为自定义特征
我编写了一个扩展 Iterator[A] 的自定义特征,并且我希望能够使用我在从另一个方法返回的 Iterator[A] 上编写的方法。这可能吗?
我仍在努力理解整个隐含的事情,并且不太喜欢在Bar
对象定义中编写方法。我将如何包装这样的物品以按照我上面想要的方式工作?
scala - 在 Scala 中,“println(1,2)”是如何工作的?
在 Scala (2.7.7final) 中,该Predef.println
方法被定义为具有以下签名:
怎么会,那么以下工作:
编译器是否会自动将逗号分隔的参数列表转换为元组?用什么魔法?这里是否有隐式转换,如果有,是哪一个?
c# - 等效隐式运算符:为什么它们是合法的?
更新!
请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了一些东西,因为在我看来,我在这个问题中描述的行为实际上违反了规范。
更新2!
好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什么。规范中的“源类型”一词指的是转换自的类型——即,Type2
在我下面的示例中——这仅仅意味着编译器能够将候选者缩小到定义的两个运算符(因为Type2
源类型是对彼此而言)。但是,它不能进一步缩小选择范围。所以规范中的关键词(因为它适用于这个问题)是“源类型”,我之前误解(我认为)它的意思是“声明类型”。
原始问题
假设我定义了这些类型:
然后说我这样做:
显然这是模棱两可的,因为不清楚implicit
应该使用哪个运算符。我的问题是——因为我看不到任何解决这种歧义的方法(它不像我可以执行一些显式转换来澄清我想要的版本),但是上面的类定义确实编译——为什么编译器允许那些匹配的implicit
运算符?
解剖
好的,我将通过 Hans Passant 引用的 C# 规范的摘录来尝试理解这一点。
找到将考虑用户定义的转换运算符的类型集 D。该集合由 S(如果 S 是类或结构)、S 的基类(如果 S 是类)和 T(如果 T 是类或结构)组成。
我们正在从 Type2
( S )转换为 Type1
( T )。因此,这里的D似乎包括示例中的所有三种类型:(Type0
因为它是S的基类)、Type1
(T)和Type2
(S)。
找到一组适用的用户定义的转换运算符 U。该集合由 D 中的类或结构声明的用户定义的隐式转换运算符组成,它们从包含 S 的类型转换为由 T 包含的类型。如果 U 为空, 转换未定义并发生编译时错误。
好的,我们有两个满足这些条件的运算符。in 声明的版本Type1
符合要求,因为Type1
它在D中,并且它从Type2
(显然包含S)转换为Type1
(显然包含在T中)。出于完全相同的原因,in 中的版本Type2
也符合要求。所以U包括这两个运算符。
最后,关于在U中查找运算符的最具体的“源类型” SX:
如果 U 中的任何运算符从 S 转换,则 SX 是 S。
现在,U中的两个运算符都从S转换- 所以这告诉我SX是S。
这不是意味着Type2
应该使用该版本吗?
可是等等!我很困惑!
难道我不能只定义Type1
' 运算符的版本,在这种情况下,唯一剩下的候选者将是Type1
' 版本,但根据规范SX将是Type2
?这似乎是一种可能的情况,其中规范要求一些不可能的事情(即,Type2
应该使用中声明的转换,而实际上它不存在)。