问题标签 [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.

0 投票
1 回答
560 浏览

scala - Scala 用于理解 unapplySeq

我有一个

我想在列表理解中使用它,例如:

但是当“rader”中的“rad”因为提取器返回而失败时,None我得到一个MatchError.

理解提取器不应该处理/忽略这些None案例还是我只是错过了什么?

我可以做

但这不会那么性感;)谢谢

0 投票
0 回答
344 浏览

scala - Scala-Lift:对重载定义的模糊引用-子类中的取消应用方法

编译器说

代码看起来像这样(Scala + Lift)

和 AbstractJsonConversion 看起来像这样

如果我将重载的 unapply 方法从父类 AbstractJsonConversion 移动到伴随对象 UserDto 一切都很好。

我想知道我在这里做错了什么?为什么我不能在父类 AbstractJsonConversion 中使用重载方法 unapply 而在它的子伴随对象中使用另一个方法?

0 投票
2 回答
8854 浏览

scala - 使用 scala 提取器将字符串转换为 Int

我正在尝试String使用Int提取器。我的代码如下所示。

我收到运行时错误:java.lang.String cannot be cast to java.lang.Integer. 似乎根本没有使用提取器。我应该怎么办?

编辑:我的用例如下。我正在使用 play,我想解析在 url 中传递的查询字符串。我想获取查询字符串值(String)并将其用作 Int、Double 等。例如,

0 投票
2 回答
2302 浏览

scala - Scala 中高级类型推理的限制是什么?

在以下简化的示例代码中:

我可以在 applicativeOne 上调用 applicativeTwice,并且类型推断有效,只要我尝试在 applicativeTwice(applicativeOne) 上调用它,推断就会失败:

scala 2.10.0 中的错误是

为什么“?F”不能与任何(正确的)匹配?最终,我希望 applicativeTwice 成为一个隐式函数,但我必须首先让类型推断起作用。我见过类似的问题,答案指出了类型推断算法的局限性。但是这种情况似乎非常有限,并且在 monad 转换器中一定很烦人,所以我怀疑我错过了一些解决这个问题的技巧。

0 投票
1 回答
876 浏览

scala - 如何在多态 unapply 中使用提取器?

我真的不明白这个小东西。我有一个抽象类 Box,其中包含不同类型的几个子类。例如

Box 的伴生对象中的 apply 方法很简单:

所以我可以写

好吧,写 unapply 会有些麻烦。我的第一个想法是对类型使用模式匹配,如下所示:

}

由于类型擦除,这根本不起作用。

第二次尝试是具有类型 T 的通用 Box[T] 和在每个子类中重新定义的抽象类型成员。例如:

因此,我可以将我的 unapply 重新编写为:

不幸的是,这也不起作用。所以我猜 Box[String] 中的显式类型引用也会被删除,所以我需要使用类型清单。也许是这样的:

此代码编译(2.10),但仍然没有所需的隐式转换。为什么?

简单的问题,有没有办法在不使用反射或清单的情况下进行值提取?

真正让我感到困惑的是,是否有一种简单的(r)方法可以结合多态性和模式匹配?如果没有,Scala 中是否有其他方法可以实现类似的效果?

有什么想法或建议吗?

非常感谢你。

0 投票
2 回答
276 浏览

scala - 如何在 Scala unapply 函数中继承共享代码?

我有一些样板文件的 Scala 代码,我认为它是 Scala,所以我一定做错了什么。我需要一些帮助来弄清楚如何删除冗余。

在这个简单的示例中,有偶数和奇数,它们是一般数字类型的子类型。偶数和奇数都有提取器,可以从字符串中创建它们。这启用了以下用例。

x % 2除了运算结果 ( 0or 1) 和提取类型 ( EvenNumberor )之外,这两个提取器的源代码是相同的OddNumber。我希望能够编写一次源代码并对这两个值进行参数化,但我不知道如何。我尝试了各种类型参数化无济于事。

Stackoverflow 问题“ How to use extractor in polymorphic unapply? ”是相关但不同的,因为我的实现类不是通过它们包含的类型来区分,而是通过它们识别的字符串输入来区分。


这是代码的修订版本,除了原始帖子之外,还包含我收到的评论。(通常情况下,第一轮答案帮助我弄清楚我真正的问题是什么。)

分解出一个静态NumberParser.parse函数是一个合理的解决方案。我仍然希望有语法糖来消除我unapply在所有案例类中的重复行,因为在一个更复杂的示例中,有两个以上可能会变得丑陋。有谁知道这样做的方法?

更关键的是,我真正想要支持的用例如下。

同样,这对于两种情况都很好,但在有两个以上的不同应用程序中,它可能变得难以管理。我想写一个案例

它返回OddNumber(5), EvenNumber(4)None如上。我不知道如何编写我的Number超类型来支持这一点。斯卡拉有可能吗?


编辑:在“使用 Scala 提取器的运行时多态性”中写了我的最终答案的描述以及附加评论。

0 投票
2 回答
2451 浏览

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,在这种情况下基本上myXx.. 的别名。但在我们的例子中 - x @ UpperCase(). x绑定到UpperCase().unapply()..x作为参数。我的意思是这里的绑定是非常抽象/广泛的概念..

0 投票
1 回答
1042 浏览

scala - Scala自定义不适用于泛型

我想通过一个自定义的通用 unapply 函数来压缩我的评估器,该函数评估参数并在成功时返回值。

但这失败并出现错误error: not found: type Eval

有什么方法可以做到这一点?我查看了typetags, unapply方法的隐式转换,但我不知道如何将它们集成到这个问题中。如何正确定义 Eval?

0 投票
1 回答
323 浏览

scala - scala Nil 类型与 arraybuffer 匹配

我在 scala 中发现了一个奇怪的工作结构:

返回

显然这已经部分适用于 Vectors,但不适用于模式匹配。有人可以解释一下吗?Nil 没有任何名为 unapply 的方法。这怎么可能?

0 投票
2 回答
498 浏览

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 线程表明此功能是不可能的,但我希望从那时起事情发生了变化,或者有可用的解决方法。