天真的问题我相信,但我发现只是从构造函数中调用其他构造函数.我需要调用一个方法.我的班级(开始):
class ScopedIterator[T](val iter : Iterator[T])
{
private var had_next : Boolean;
private var value : T;
moveNext();
...
Run Code Online (Sandbox Code Playgroud)
所以我想有一个带有单个参数的构造函数,并在这样的构造函数中调用方法moveNext.就这样.
当我编译代码时,我得到错误:
错误:抽象成员可能没有私有修饰符
private var had_next:Boolean;
和价值相同.
我改成了:
class ScopedIterator[T]
{
private var had_next : Boolean;
private var value : T;
private var iter : Iterator[T];
def this(it : Iterator[T]) =
{
iter = it;
moveNext();
}
...
Run Code Online (Sandbox Code Playgroud)
但现在我得到"iter = it"的错误:
错误:'this'预期但找到了标识符.
iter = it;
如何在Scala中编写这样的构造函数?
2012-02-04由"homoiconicity"字样赞助http://en.wikipedia.org/wiki/Homoiconicity.
背景:我即将选择哪本关于Clojure的书 - "Clojure in Action"或(4月底传入)"Clojure Programming"(您可以通过O'Reilly Rough Cuts阅读 ,一半页面是可见的).令我震惊的是,在这两本书中,这种属性 - 同质性 - 得到了如此重视.
由于Clojure的根源是以Lisp为基础的,所以我提到 "死性感"这本书真是太重要了.好吧,我可以看到详细解释的宏,但我没有听到提到的重点.现在比较一下(引自"Clojure in Action")
这种同质性也是Clojure宏观系统成为可能的原因.
它几乎看起来没有它,宏是不可能的.甚至维基百科声明(上面的链接)也更加平衡,但这些来源(*)都没有计算人为因素而支持英语语法.
如果我没有弄错的话,宏语法(类似于Lisp)可以在C#中实现(例如),只需要C#团队付出更多努力.但这是设计师团队的成本,而不是用户(?).第二 - habbits很重要.如果在现实生活中你认为"a + b",并且在计算机世界中你不断将它翻译成"+ a b",那么生产力就会受到影响(当我从C++ functor转到C#lambdas时,我可以看到这一点).
这个赞美,即Clojure程序员几乎直接将程序编写为AST,让我感到害怕,因为"由于直接用十六进制代码编写代码,不仅你学习十六进制系统,而且你更接近机器".
总结一下 - 我喜欢元编程,我喜欢类似Lisp的宏(虽然我不是Lisper),但我在这里看到两件事 - 宏和同质性.第一个毫无疑问是伟大的,第二个 - 不是那么多(至于我的理解),因为它使人类适合计算机的需要,它应该是另一种方式.
同性恋真的对人类(语言的最终用户)有益,或者它实际上几乎只对语言设计者有益吗?非常欢迎例子!
或者以防万一我改写 - 假设给定的语言有Lisp-macros,"增加"同质性会提高最终用户的生产力吗?Expresiveness?还是相反?
(*)我不能百分百肯定,因为我只看到一小部分Clojure书籍,我不是在阅读它们,只是评估它们的购买.
谢谢大家的答案,可惜我只选择一个作为解决方案:-),这并不意味着我更少重视别人,这对我来说是最完整的.
我发现了类似的主题:
C++(stl)与Java中的迭代器,是否存在概念上的差异?
这基本上处理Java迭代器(类似于C#)无法后退.
所以在这里我想关注限制 - 在C++迭代器中不知道它的限制,你自己将给定的迭代器与限制进行比较.在C#中,迭代器知道更多 - 如果迭代器有效,你可以在不与任何外部引用比较的情况下判断.
我更喜欢C++方式,因为一旦有了迭代器,你可以将任何迭代器设置为限制.换句话说,如果您只想获得少量元素而不是整个集合,则不必更改迭代器(在C++中).对我来说它更"纯粹"(清晰).
但是当然MS在设计C#时知道这个和C++.那么C#方式的优点是什么?哪种方法更强大(这导致基于迭代器的更优雅的功能).我错过了什么?
如果您对C#与C++迭代器设计的想法不同于它们的限制(边界),请同时回答.
注意 :(以防万一)请保持严格的技术讨论.没有C++/C#flamewar.
正如Tzaman所说:"限制单独表达没有任何好处,因为除了一次走一个元素之外没有办法到达那里." 但是,构建一个一次执行几个步骤的C#迭代器并不困难,因此问题是 - 是否有一个显式限制迭代器的好处(如在C++中)?如果是 - 什么?
Edit1:假设你有一个函数foo,它在迭代器上做了一些事情(这个例子很天真!)
void foo(iter_from,iter_end) // C++ style
void foo(iter) // C# style
Run Code Online (Sandbox Code Playgroud)
现在你想在除了最后10个之外的所有元素上调用功能栏.
bar(iter_from,iter_end-10); // C++ style
Run Code Online (Sandbox Code Playgroud)
在C#中(如果我没有记错的话)你必须为这个迭代器提供额外的方法来改变它的限制,如下所示:
bar(iter.ChangeTheLimit(-10));
Run Code Online (Sandbox Code Playgroud)
编辑2:重读你的帖子后,我感觉到了至关重要的区别.在C++中,您处理集合的迭代器,在C#中您处理集合(迭代器在内部使用).如果是的话,我仍然对C#感到有点不舒服 - 你迭代了这个集合,当你找到有趣的元素时,你想要将所有元素从"here"传递到结尾.在C++中,它非常简单,没有开销.在C#中,您要么传递一个迭代器,要么传递一个集合(如果后者会有额外的计算).我等你的评论:-)
我不是在比较苹果和橘子.比较.理论在这里是共同点,所以你有排序算法,分区等.你有收集的概念(或序列,如乔恩喜欢).现在 - 问题是你如何设计对元素的访问,以便用C#或C++(或任何其他语言)编写优雅的算法.我想理解"我们这样做的原因,因为......".
我知道.NET迭代器和集合是单独的类.我知道访问元素和整个集合之间的区别.但是在C++中,处理集合的最常用方法是使用迭代器 - 这样您就可以使用列表和向量,尽管这些集合完全不同.另一方面,在C#中你更愿意写
sort(IEnumerable<T> coll)
Run Code Online (Sandbox Code Playgroud)
功能而不是
sort(IEnumerator<T> iter)
Run Code Online (Sandbox Code Playgroud)
正确?所以在这个意义上我猜你不能把C#迭代器作为C++迭代器,因为C#不像C++那样表达相同的算法.或者正如Jon指出的那样 - 在C#中你更倾向于转换集合(Skip,Take)而不是改变迭代器.
更确切地说 - 如何以标准方式做到这一点?
我喜欢我的程序引起的VS跟踪异常的方式,因此当从VS运行它时,我没有理由使用我自己的机制来处理和显示异常.当然,当程序作为独立应用程序执行时,我必须依赖我的异常处理程序.
我知道,我可以在VS中定义一个参数来运行程序,这样可以识别这是否是VS运行,但我正在寻找标准的东西.也许VS设置一个标志,表明这是VS运行?
我有两个WPF(来自标准集)小部件A和B.当我改变A的某个属性时,它应该在B上设置,当它在B中改变时应该在A上设置.
现在我有这个丑陋的递归 - >我改变A,所以代码改变B,但是因为B改变了,它改变了A,所以它改变了B ......你有了图片.
如何避免这种递归最"标准"的方式?天真地删除和添加事件处理程序不起作用,并且检查新值是否与旧值相同在此处不适用(因为计算的波动 - 我没有将相同的值设置为A和B,但是已转换) .
我总是尝试提供有关问题的最小信息以避免混淆.但是,这可能会有所帮助
尽管标题是"递归触发",处理程序会按顺序调用,因此您可以使用序列entry-exit-entry-exit-entry-exit,而不是entry-entry-entry-exit-exit-exit
而最后一个,可能是最不重要的,但不过
A和B(在这种情况下)是滚动查看器,我尝试按比例保持两个相同的位置.该项目(由Karin Huber提供)在这里:http: //www.codeproject.com/KB/WPF/ScrollSynchronization.aspx
阻止事件的想法非常受欢迎,我添加了触发事件的顺序,我们开始:
如你所见,这是徒劳的.
当您使用谷歌搜索此类问题时,您会获得大量点击,但所有解决方案都假设您至少有一个窗口.
但我的问题就像我说的那样 - 根本不是假设.我可以有一个窗口,但我可以有零窗口(因为我甚至没有显示一个窗口,或者我只关闭了最后一个窗口).因此,简而言之,解决方案不能依赖于任何窗口小部件或窗口 - 唯一已知的是,是否存在桌面(和应用程序正在运行,但它没有任何窗口).
所以问题是 - 如何获得鼠标位置?
我想显示以鼠标位置为中心的窗口.在WPF中没有这样的模式(只有所有者的中心,或者屏幕的中心)所以我必须手动完成.缺少的部分是鼠标位置.
谢谢大家,所以现在我有解决方案的第一部分 - 原始位置.现在有一个问题如何转换WPF的数据.我发现了这样一个主题: WPF像素到桌面像素, 但又一次,它假设有一些窗口.
然后我google了更多,我找到了解决方案:http: //jerryclin.wordpress.com/2007/11/13/creating-non-rectangular-windows-with-interop/
代码包括仅依赖于桌面信息的放大/缩小坐标的类.所以加入这两件,我终于得到了解决方案:-).再次感谢.
我看,我没有看到.
我有一个包含两个项目的解决方案 - 项目A(库)和项目B,它是主项目,包含T4文本模板.
到目前为止我做了什么 - 我在主项目中添加了一个项目A的引用.我在模板中包含了这样的行:
<#@ import namespace="MyProjectA" #>
Run Code Online (Sandbox Code Playgroud)
然而,仍然存在错误"编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少using指令或程序集引用?)"
问题:如何从文本模板引用项目A?
请注意:我想在解决方案中引用一个项目,而不是磁盘上的dll文件.
如果我问"如何将文件读成字符串"的问题,那么答案就很明显了.然而 - 这里保留了CR/LF的捕获量.
问题是,File.ReadAllText
剥离这些字符.StreamReader.ReadToEnd
我刚刚将LF转换为CR导致我进行了长时间的调查,其中我有非常明显的代码中的错误;-)
因此,简而言之,如果我有一个包含文件foo\n\r\nbar
我想获得foo\n\r\nbar
(即内容完全一致),而不是foo bar
,foobar
或foo\n\n\nbar
..Net空间中是否有一些可以使用的方法?
结果应该始终是单个字符串,包含整个文件.
在PHP7中添加了错误,我遇到以下代码的问题:
(some complex expression)->my_property = 1
Run Code Online (Sandbox Code Playgroud)
请注意我分配给对象的字段,而不是对象本身(分配给临时对象没有意义,我同意,但在这里并非如此).
这给了我一个错误"不能在写上下文中使用临时表达式".当我重写为:
$tmp = (some complex expression);
$tmp->my_property = 1;
Run Code Online (Sandbox Code Playgroud)
一切都好.问题是我必须有单个表达式(赋值是一个表达式),并且因为PHP现在不支持逗号运算符,所以我要用两个语句来讨论.
对我来说这是巨大的差异,因为我无法将整个代码作为表达式进一步传递.在"复杂表达"中,一切都是有效的,所以我很乐意在PHP中禁用该检查.
可能吗?怎么样?
我的代码是自动编写的(它是生成的),表达式的结果是一个有效的PHP对象,问题是PHP以某种方式没有注意到它.此外,第二种形式有效.
更新:这是我上面提到的复杂表达式的一个例子:
(($a = foo()) === 0 ? $a : bar())
Run Code Online (Sandbox Code Playgroud) 历史
我有一个"记录"列表(3,500),我保存到XML并在程序退出时压缩.以来:
我需要另一个解决方案 - 嵌入式数据 我之所以选择SQL CE,是因为它与VS一起使用没有任何问题,许可证对我来说是好的(我把它比作Firebird,SQLite,EffiProz,db4o和BerkeleyDB).
数据
记录结构:11个字段,其中2个构成主键(nvarchar + byte).其他记录是字节,数据时间,双精度和整数.
我不使用任何关系,连接,索引(主键除外),触发器,视图等.它实际上是平的字典 - 对键+值.我修改了其中一些,然后我必须在数据库中更新它们.我不时添加一些新的"记录",我需要存储(插入)它们.就这样.
LINQ方法
我有空白数据库(文件),所以我在一个循环(逐个)中进行3500插入.我甚至不检查记录是否已经存在,因为db是空白的.
执行时间处理时间?4分52秒 我昏了过去(记住你:XML + compress = 3秒).
SQL CE原始方法
我google了一下,尽管有这样的声明: LINQ to SQL(CE)速度与SqlCe 说明它是SQL CE本身的错误我试了一下.
相同的循环,但这次插入是使用SqlCeResultSet(DirectTable模式,请参阅:SQL Server CE中的批量插入)和SqlCeUpdatableRecord.
结果?你坐得舒服吗?好吧...... 0.3秒(是的,第二个的一小部分!).
问题
LINQ 非常易读,原始操作完全相反.我可以编写一个映射器,将所有列索引转换为有意义的名称,但它似乎重新发明轮子 - 毕竟它已经在... LINQ中完成了.
那么也许这是告诉LINQ加快速度的一种方式?问题 - 怎么做?
代码
LINQ
foreach (var entry in dict.Entries.Where(it => it.AlteredByLearning))
{
PrimLibrary.Database.Progress record = null;
record = new PrimLibrary.Database.Progress();
record.Text …
Run Code Online (Sandbox Code Playgroud)