- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是简单的代码:
import std.algorithm;
import std.array;
import std.file;
void main(string[] args)
{
auto t = args[1].readText()
.splitter('\n')
.split("---")
;
}
Error: template std.algorithm.iteration.splitter cannot deduce function from
argument types !()(Result, string), candidates are:
...
Error: template instance std.array.split!(Result, string) error instantiating
.array
之前插入
.split
,它将进行编译。
最佳答案
底线:通常可以通过在有问题的功能之前粘贴一个.array
调用来解决此类问题。这为它提供了具有足够功能来运行算法的缓冲区。
以下是该库背后的推理以及您也可以用来实现此目的的其他一些想法:
无法编译的原因与std.algorithm和range背后的理念有关:它们尽可能便宜,可以将成本决策推向最高水平。
在std.algorithm(以及大多数写得很好的范围和范围消耗算法)中,模板约束将拒绝任何无法免费提供所需内容的输入。同样,转换范围(如滤波器,分离器等)将仅返回它们可以以最低成本提供的那些功能。
通过在编译时拒绝它们,它们迫使程序员在最高级别上做出有关如何支付这些费用的决定。您可能会重写该函数以使其工作方式不同,可以使用各种技术自己缓冲该函数以预先支付费用,或者您可以找到其他可行的方法。
因此,这就是您的代码所发生的情况:readText
返回一个数组,该数组几乎是功能齐全的范围。 (由于它返回的是由UTF-8构成的string
,因此就Phobos而言,它实际上并未提供随机访问权限(尽管令人困惑,语言本身对此有所不同,请在D论坛中搜索“autodecode”争议,您想了解更多),因为在可变长度的utf-8字符列表中找到Unicode代码点需要全部扫描。全部扫描并不是最小的花费,因此Phobos绝不会尝试它,除非您特别要求。)
无论如何,readText
返回的范围具有很多功能,包括splitter
需要的可扩展性。为什么splitter
需要保存?考虑一下它所 promise 的结果:从最后一个分割点开始一直到下一个分割点的一系列字符串。当为最通用的范围编写此代码时,实现可能看起来像什么?
遵循以下原则:首先,save
您的起始位置,以便稍后返回。然后,使用popFront
,逐步进行查找,直到找到分割点。完成后,将保存的范围返回到分割点。然后,popFront
越过分割点并重复该过程,直到消耗完整个东西(while(!input.empty)
)。
因此,由于splitter
的实现需要具有对save
起点的能力,因此它至少需要一个正向范围(这只是一个可扩展的范围。Andrei现在觉得这样的命名有点傻,因为名称太多了,但是在在他写std.algorithm
的时候,他仍然坚信给他们起全部名字)。
并非所有范围都是正向范围!保存数组就像从当前位置返回一个切片一样容易。许多数值算法也是如此,保存它们只是意味着保留当前状态的副本。如果要转换的范围是可保存的,则大多数转换范围都是可保存的-同样,它们所需要做的就是返回当前状态。
......实际上,我认为您的例子应该是可理解的。实际上,确实存在一个需要谓词并进行编译的重载!
http://dlang.org/phobos/std_algorithm_iteration.html#.splitter.3
import std.algorithm;
import std.array;
import std.stdio;
void main(string[] args)
{
auto t = "foo\n---\nbar"
.splitter('\n')
.filter!(e => e.length)
.splitter!(a => a == "---")
;
writeln(t);
}
[["foo"], ["bar"]]
.splitter("---")
无法编译,因为该重载需要切片功能(或狭窄的字符串,Phobos拒绝对其进行一般切片……但知道它实际上仍然可以,所以该功能是特殊情况。整个图书馆。)
saved.take(that_count)
....也许这就是那里的原因。 :您将遍历项目两次,一次是在算法内部,另一次是在外部,而库认为这样做成本很高,因此无法扩展一个级别。(谓词版本通过让您的函数进行扫描来回避这一点,因此Phobos认为这是可行的。不再是问题,您已经知道自己的功能在做什么。)
splitter
不为其输出提供索引或切片?
filter
为什么也不提供它?为什么
map
提供它?
map
可以提供它(假设它的输入可以提供),因为
map
实际上并没有改变元素的数量:输出中的第一个元素也是输入中的第一个元素,只是在结果上运行了一些功能。最后是同上,其他之间也一样。
filter
改变了这一点。滤除[1,2,3]的奇数只会得到[2]:长度不同,现在在开头而不是中间找到2。但是,直到您真正应用过滤器,您才能知道它的位置-您必须在不缓冲结果的情况下跳来跳去。
splitter
与filter类似。它改变了元素的位置,并且算法直到它实际遍历元素时才知道它在哪里拆分。因此,它可以在您迭代时告诉您,但不能在迭代之前出现,因此索引编制将是
O(n)
速度-计算上过于昂贵。索引应该是非常便宜的。
splitter
为什么需要它,我们可以研究满足该算法的方法:我们需要使用占用更多CPU周期的版本,并使用我们的自定义代码进行编写比较功能(请参见上面的示例),或以某种方式提供切片。最直接的方法是将结果缓存在数组中。
import std.algorithm;
import std.array;
import std.file;
void main(string[] args)
{
auto t = args[1].readText()
.splitter('\n')
.array // add an explicit buffering call, understanding this will cost us some memory and cpu time
.split("---")
;
}
关于d - 拆分/拆分的编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33380674/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!