- 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/
假设我有这个变量 var image = "image.jpg"; 我正在尝试拆分变量图像的内容并将 _thumbs 插入其中以获得类似 image_thumbs.jpg 的内容。 我该如何解决这个问
我有一个包含多个问题和答案的单元格,其组织方式类似于 CSV。因此,为了将所有这些问题和答案分开,使用逗号作为分隔符的简单拆分应该很容易分开。 不幸的是,有些值使用逗号作为小数分隔符。有没有办法避免这
这是简单的代码: import std.algorithm; import std.array; import std.file; void main(string[] args) { aut
我正在尝试解析一个看起来像的 txt 文件 A - 19 B - 2 C - 3 我正在使用扫描仪方法读取它并在“- ”中拆分,以便我的输出看起来像: A 19 B 2 C 3 但是它似乎没有正确拆分
我有这些网址字符串 file:///home/we/Pictures/neededWord/3193_n.jpg file:///home/smes/Pictures/neededWord/jds_2
我正在解析一个 CVS 文件,如下所示: "07555555555",25.70,18/11/2010,01/03/2011,N,133,0,36,,896,537,547,,Mr,John,Doe,
我在脚本中使用以下行返回 $folder 处所有文件夹的所有路径地点。 dir -recurse $folder|?{$_.PSIsContainer}|select -ExpandProperty
我正在尝试将字符串格式化为word+word+word 例如 “超音乐节”变成“超+音乐+节日” 我尝试过使用以下代码 query.split(" ").join("+"); 或 query.repl
我叫 luis,住在 arg。我有一个问题,无法解决。 **IN BASH** pwd /home/labs-perl ls file1.pl file2.pl **IN PERL** my $ls
我想从包 javax.json 中拆分 JsonArray,但我找不到完成这项工作的便捷方法。我查看了文档,只能想到迭代 JsonArray 并使用 JsonArrayBuilder 手动添加项目。
我希望在第一个 ':' 处拆分字符串,以防止字符串的第二部分包含 ':' 时出现问题。我一直在研究正则表达式,但仍然遇到一些问题,有人可以帮我吗?谢谢。 最佳答案 您可以使用overload of s
我想拆分列表的列表 ((A,1,2,3),(B,4,5,6),(C,7,8,9))进入: (A,1) (A,2) (A,3) (B,4) (B,5) ... 我试过rdd.flatMapValues(
我有一个文本文件,其中每一行都有数据。它看起来像这样: number0;text0 number1;text1 number2;text2 ..等等 所以我通过 xmlhttprequest 将该文本
问题很简单——比如说,我得到了函数,它接收数组作为参数 void calc(double[] data) 如何将这些数据“拆分”成两个子数组并像这样传递给子函数 calc_sub(data(0, le
我想显示来自 EMAIL_TEXT 数据库列的数据,在定义的字符处拆分列。出于某种原因,我的结果只打印第一行到我拆分字符串的位置,跳过其余行。这是我希望在每个“|”之后拆分的数据。 这里是要拆分的数据
我有一个动态数组,我想排除字符串的第一部分,但我不知道第一部分之后会有多少对象,我想将它们全部包含在一个新字符串中。 string = "text.'''hi''','''who''' '''are'
我想拆分 URL 的某些特定部分,这是我目前所做的。 var query = window.location.pathname.split( '/' ); query = window.locati
我有一条消息携带 XML(订单),其中包含多个同质节点(比如产品列表)以及其他信息(比如地址、客户详细信息等)。我必须使用另一个外部服务提供的详细信息来丰富每个“产品”,并返回带有丰富“产品”的相同完
我有一个动态生成的大字符串,我正在拆分它。 var myString="val1, val, val3, val4..... val400" 我对此字符串进行了简单的拆分, myString= myS
这个问题在这里已经有了答案: Java String split removed empty values (5 个答案) 关闭 7 年前。 我正在尝试使用 split(";") 将字符串转换为数组
我是一名优秀的程序员,十分优秀!