问题标签 [enrich-my-library]

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 投票
5 回答
2270 浏览

scala - Scala,扩展迭代器

我希望扩展迭代器以创建一个新方法takeWhileInclusive,该方法将像takeWhile但包含最后一个元素一样运行。

我的问题是扩展迭代器以返回一个我希望对其进行惰性评估的新迭代器的最佳实践是什么。来自 C# 背景,我通常使用IEnumerable并使用yield关键字,但在 Scala 中似乎不存在这样的选项。

例如我可以

所以在这种情况下,takeWhileInclusive只有在我得到大于 6 的结果之前,才会解析值的谓词,并且它将包括第一个结果

到目前为止,我有:

0 投票
1 回答
380 浏览

scala - What is the best way to use enrich-my-library in scala?

The are two different way to implement it.

One is more short

Second is more long

Which one is better?

0 投票
1 回答
708 浏览

java - 选项化 Java getter

在 Scala 中使用 Java 时,我们必须考虑 null。

例如,HttpServletRequest getter(getAttribute、getHeader 等)都可能返回 null。

我知道我可以在每次调用 HttpServletRequest 方法时手动执行 case/match 或 map 操作,但这有点乏味。此外,像 request.getHeader("Accept-Encoding") 之类的方法调用很麻烦。

我想出了一个丰富的方法来处理这两个问题:

1) 是否有比丰富我的图书馆的另一种/更好的方法来实现相同/相似的效果?
2)如果这是“可行的”方式,那么性能影响/风险是什么?换句话说,是否会被这种模式的明显实用性/便利性烧毁?

对不起,如果这东西很明显,前几天才开始丰富,它看起来真的很有用。只是想确保我在适当的场景中应用模式......

编辑
@dhg 指出 Option.apply() 和:

是等价的,所以 getter 方法现在使用 Option(f()) 而不是我无关的 safe(f()) 包装器

谢谢

0 投票
2 回答
225 浏览

json - 如何基于丰富动态调度?

Spray-json库使用方法扩展了基本的 Scala 类型toJson。如果底层类型存在这样的皮条客,我想将其转换Any为 a 。JsValue我最好的尝试有效,但很冗长:

理想情况下,我更喜欢这样的东西(不可能):

有没有一种方法可以做到这一点,而无需枚举已丰富的每种类型?

0 投票
4 回答
7786 浏览

scala - 有没有办法在不将代码包装到另一个对象中的情况下“丰富”一个 Scala 类?

在 Scala 2.9 中,要向库类添加自定义方法(丰富或“pimp”它),我必须编写如下内容:

随着 Scala 2.10 的发布,我读到它引入了隐式类定义,从理论上讲,它旨在通过消除返回匿名类对象的隐式方法的需要来简化上述任务。我以为它能让我写

这对我来说看起来更漂亮。但是,这样的定义会导致编译错误:

这可以通过再次将代码包装在一个对象中来解决:

不用说,这几乎抵消了改进的感觉。

那么,有没有办法把它写得更短?摆脱包装对象?

我实际上有一个MyApp.pimps所有皮条客都去的包(我没有太多,如果有的话,我会使用一些单独的包)而且我厌倦了导入MyApp.pimps.StringPimper._而不是MyApp.pimps.PimpedStringor MyApp.pimps._。当然,我可以将所有隐式类放在一个包装器对象中,但这意味着将它们全部放在一个文件中,这会很长 - 非常丑陋的解决方案。

0 投票
1 回答
1118 浏览

scala - 您如何在没有开销的情况下丰富价值类别?

Scala 2.10 引入了值类,您可以通过使类扩展来指定它们AnyVal。值类有很多限制,但它们的巨大优势之一是它们允许扩展方法而不会产生创建新类的惩罚:除非需要装箱,例如将值类放入数组中,否则它只是旧类加上一组将类作为第一个参数的方法。因此,

展开到不会比自己编写更昂贵的i + j*j东西(一旦 JVM 内联方法调用)。

不幸的是,SIP-15中描述值类的限制之一是

  1. C 的基础类型可能不是值类。

如果你有一个值类,你可以得到你的手,比如说,作为一种提供类型安全单元的方法,而不需要装箱的开销(除非你真的需要它):

那么有没有办法在Meter没有对象创建开销的情况下丰富呢?SIP-15 中的限制阻止了明显的

方法。

0 投票
1 回答
202 浏览

c# - 丰富我的图书馆优化

免责声明:我从 C# 来到 Scala,我非常欣赏 LINQ。因此,我立即对迭代器和序列感到宾至如归。我错过了产量“C#风格”,但我能够用延续来自己做饭……即使它会付出性能损失。

现在,当我在 C# 中遗漏某些方法而不是集合时,我只是将其定义为扩展方法,并且编译器在有效处理代码方面做得非常好。在 Scala 中,我使用Pimp丰富我的库方法,但我有点担心性能。

然而,与我的“产量迭代器”相反,这是一种公认​​的常见模式。Scala 编译器是否对其进行了优化,删除了临时对象的创建?

如果不是,为什么?对我来说,这看起来是一个很好且安全的优化。我可以向正确的方向“提示”或“强制”编译器吗?有哪些更快的替代方案?

我想将该模式用于我的迭代器/可迭代算法集合,因此我可以将它们写为过滤器/映射/等collection.baz(lambda).bar(lambda2),但我担心它会被证明太“重”。(与更高效/直接但丑陋的相比bar(lambda2, baz(lambda, collection)

0 投票
1 回答
685 浏览

scala - 当类型参数之一应该是 Nothing 时,为什么 Scala 的隐式类不起作用?

更新:我修改了示例,以便可以编译和测试。

我有一个定义丰富方法的隐式类:

R问题是Nothing在第二个示例中它不起作用。它会导致编译器错误:在这种情况下,我会收到以下编译器错误:

为什么会这样?


我设法通过为这种情况创建一个单独的隐式类来解决它:

但是我可以依赖 Scala 在未来的行为,它不会考虑Nothing作为一种选择R吗?如果将来发生变化,代码将停止工作,因为我将有两个不同的适用隐式。

0 投票
1 回答
208 浏览

scala - 为所有 Traversables 丰富我的库

我试图弄清楚如何编写一个适用于 any 的功能交换函数Traversable[_],给定一个集合和要交换的索引。我想出了以下内容:

我想知道如何使它成为 Traversable 的隐式扩展,使我能够使用List(1,2,3,4,5).swap(0, 4). 我能得到的最接近的是以下内容:

不幸的是,这还不是。调用List(1,2,3,4,5).swap(0, 4)导致以下错误:

错误:List[Int] => Traversable[A] 没有可用的隐式视图

我觉得我一定遗漏了一些东西,或者使问题过于复杂化。有谁知道这应该如何构建?


注意:这纯粹是学术性的,不会以任何方式在生产环境中使用。我试图更好地处理 Scala 的类型系统和边界。

0 投票
1 回答
79 浏览

scala - 如何在不丢失类型推断的情况下隐式扩展函数

对于 DSL,我需要隐式扩展函数值。例如:

使用的函数PimpedFunction可以定义为:

问题出在调用takes. 以下按预期工作:

但是,如果我省略参数类型,编译将无法推断它:

我可以更改任何内容以帮助 scalac 的推理吗?

OBS:真正的用例与此有关:https ://gist.github.com/xeno-by/4542402