问题标签 [unapply]
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 用于理解 unapplySeq
我有一个
我想在列表理解中使用它,例如:
但是当“rader”中的“rad”因为提取器返回而失败时,None
我得到一个MatchError
.
理解提取器不应该处理/忽略这些None
案例还是我只是错过了什么?
我可以做
但这不会那么性感;)谢谢
scala - Scala-Lift:对重载定义的模糊引用-子类中的取消应用方法
编译器说
代码看起来像这样(Scala + Lift)
和 AbstractJsonConversion 看起来像这样
如果我将重载的 unapply 方法从父类 AbstractJsonConversion 移动到伴随对象 UserDto 一切都很好。
我想知道我在这里做错了什么?为什么我不能在父类 AbstractJsonConversion 中使用重载方法 unapply 而在它的子伴随对象中使用另一个方法?
scala - 使用 scala 提取器将字符串转换为 Int
我正在尝试String
使用Int
提取器。我的代码如下所示。
我收到运行时错误:java.lang.String cannot be cast to java.lang.Integer
. 似乎根本没有使用提取器。我应该怎么办?
编辑:我的用例如下。我正在使用 play,我想解析在 url 中传递的查询字符串。我想获取查询字符串值(String)并将其用作 Int、Double 等。例如,
scala - Scala 中高级类型推理的限制是什么?
在以下简化的示例代码中:
我可以在 applicativeOne 上调用 applicativeTwice,并且类型推断有效,只要我尝试在 applicativeTwice(applicativeOne) 上调用它,推断就会失败:
scala 2.10.0 中的错误是
为什么“?F”不能与任何(正确的)匹配?最终,我希望 applicativeTwice 成为一个隐式函数,但我必须首先让类型推断起作用。我见过类似的问题,答案指出了类型推断算法的局限性。但是这种情况似乎非常有限,并且在 monad 转换器中一定很烦人,所以我怀疑我错过了一些解决这个问题的技巧。
scala - 如何在多态 unapply 中使用提取器?
我真的不明白这个小东西。我有一个抽象类 Box,其中包含不同类型的几个子类。例如
Box 的伴生对象中的 apply 方法很简单:
所以我可以写
好吧,写 unapply 会有些麻烦。我的第一个想法是对类型使用模式匹配,如下所示:
}
由于类型擦除,这根本不起作用。
第二次尝试是具有类型 T 的通用 Box[T] 和在每个子类中重新定义的抽象类型成员。例如:
因此,我可以将我的 unapply 重新编写为:
不幸的是,这也不起作用。所以我猜 Box[String] 中的显式类型引用也会被删除,所以我需要使用类型清单。也许是这样的:
此代码编译(2.10),但仍然没有所需的隐式转换。为什么?
简单的问题,有没有办法在不使用反射或清单的情况下进行值提取?
真正让我感到困惑的是,是否有一种简单的(r)方法可以结合多态性和模式匹配?如果没有,Scala 中是否有其他方法可以实现类似的效果?
有什么想法或建议吗?
非常感谢你。
scala - 如何在 Scala unapply 函数中继承共享代码?
我有一些样板文件的 Scala 代码,我认为它是 Scala,所以我一定做错了什么。我需要一些帮助来弄清楚如何删除冗余。
在这个简单的示例中,有偶数和奇数,它们是一般数字类型的子类型。偶数和奇数都有提取器,可以从字符串中创建它们。这启用了以下用例。
x % 2
除了运算结果 ( 0
or 1
) 和提取类型 ( EvenNumber
or )之外,这两个提取器的源代码是相同的OddNumber
。我希望能够编写一次源代码并对这两个值进行参数化,但我不知道如何。我尝试了各种类型参数化无济于事。
Stackoverflow 问题“ How to use extractor in polymorphic unapply? ”是相关但不同的,因为我的实现类不是通过它们包含的类型来区分,而是通过它们识别的字符串输入来区分。
这是代码的修订版本,除了原始帖子之外,还包含我收到的评论。(通常情况下,第一轮答案帮助我弄清楚我真正的问题是什么。)
分解出一个静态NumberParser.parse
函数是一个合理的解决方案。我仍然希望有语法糖来消除我unapply
在所有案例类中的重复行,因为在一个更复杂的示例中,有两个以上可能会变得丑陋。有谁知道这样做的方法?
更关键的是,我真正想要支持的用例如下。
同样,这对于两种情况都很好,但在有两个以上的不同应用程序中,它可能变得难以管理。我想写一个案例
它返回OddNumber(5)
, EvenNumber(4)
,None
如上。我不知道如何编写我的Number
超类型来支持这一点。斯卡拉有可能吗?
编辑:在“使用 Scala 提取器的运行时多态性”中写了我的最终答案的描述以及附加评论。
scala - scala unapply 返回布尔值
读到这里unapply()
,我仍然对那个回报有疑问Boolean
。
如果看看Scala Programming Book (2nd edition), page 602。有一个例子:
其中 UpperCase 定义为有unapply()
返回Boolean
且没有返回的对象apply()
Twice
像这样的东西在哪里:
问题是(一定太多了,抱歉):
UpperCase().unapply(..) 如何在这里工作?
如果我通过: DIDI@hotmail.com
,那么x
在第一个代码片段 = 'DI'.. 然后我们使用 '@' ..绑定 'x' 将其传递UpperCase.unapply
给调用unapply(x)
ie unapply('DIDI')
(?) 然后它返回True
。
但为什么不Option
呢?我倾向于认为这会unapply
返回Option
......它是如何工作的一种方式。这可能是因为通常Option
包装一些数据,但对于简单的情况,我们不应该包装布尔值?因为我们没有 apply()?
有什么区别,什么时候使用Boolean
/ Option
?基于这个例子。
而这个语法:x @ UpperCase()
,如果我们在一个特定的内部匹配,它是否应该替换value match case
(我想这样阅读它?)语法case
?它似乎不像这样做的统一方式/语法。
通常像这样的语法(假设 x,y 是 Int):case AA(x @ myX, y) => println("myX: " + myX)
表示x
绑定到myX
,在这种情况下基本上myX
是x
.. 的别名。但在我们的例子中 - x @ UpperCase()
. x
绑定到UpperCase().unapply()
..x
作为参数。我的意思是这里的绑定是非常抽象/广泛的概念..
scala - Scala 隐式取消应用
我试图将类实例隐式解构为元组以创建更好的 DSL 语法。
这是我正在尝试做的一个简化示例:
结果是:
我知道我可以使用 unapply 方法定义一个伴随对象并手动处理解构(或显式调用上面的隐式),但这会产生不需要的样板。
编辑
好的,只是为了提供更多上下文,Pair
嵌入在实现 map、flatMap 和 withFilter 的实例中(即用于理解)。因此,所需的用法如下所示:
我想避免的是让 Pair 成为一个案例类(或向现有的 Pair 类添加一个自定义伴随对象)并且Pair(a,b) <- tableA join tableB on(...)
每次我加入表时都必须这样做(阅读:经常)
原来的
有没有办法在 Scala 2.10 或 2.11 中解决这个问题?从 2.8/2.9 天开始有一些较旧的 SO 线程表明此功能是不可能的,但我希望从那时起事情发生了变化,或者有可用的解决方法。