小编gre*_*man的帖子

如何在构造函数中添加一些动作?

天真的问题我相信,但我发现只是从构造函数中调用其他构造函数.我需要调用一个方法.我的班级(开始):

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中编写这样的构造函数?

constructor scala method-call

8
推荐指数
2
解决办法
6102
查看次数

拥有宏是否真的需要同质性?

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书籍,我不是在阅读它们,只是评估它们的购买.

更新

谢谢大家的答案,可惜我只选择一个作为解决方案:-),这并不意味着我更少重视别人,这对我来说是最完整的.

lisp macros clojure

8
推荐指数
3
解决办法
899
查看次数

C#迭代器设计的基本原理(与C++相比)

我发现了类似的主题:
C++(stl)与Java中的迭代器,是否存在概念上的差异?

这基本上处理Java迭代器(类似于C#)无法后退.

所以在这里我想关注限制 - 在C++迭代器中不知道它的限制,你自己将给定的迭代器与限制进行比较.在C#中,迭代器知道更多 - 如果迭代器有效,你可以在不与任何外部引用比较的情况下判断.

我更喜欢C++方式,因为一旦有了迭代器,你可以将任何迭代器设置为限制.换句话说,如果您只想获得少量元素而不是整个集合,则不必更改迭代器(在C++中).对我来说它更"纯粹"(清晰).

但是当然MS在设计C#时知道这个和C++.那么C#方式的优点是什么?哪种方法更强大(这导致基于迭代器的更优雅的功能).我错过了什么?

如果您对C#与C++迭代器设计的想法不同于它们的限制(边界),请同时回答.

注意 :(以防万一)请保持严格的技术讨论.没有C++/C#flamewar.

EDITS

正如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#中,您要么传递一个迭代器,要么传递一个集合(如果后者会有额外的计算).我等你的评论:-)

@Hans,

我不是在比较苹果和橘子.比较.理论在这里是共同点,所以你有排序算法,分区等.你有收集的概念(或序列,如乔恩喜欢).现在 - 问题是你如何设计对元素的访问,以便用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)而不是改变迭代器.

c# iterator

7
推荐指数
3
解决办法
2408
查看次数

如何检查程序是否在Visual Studio控件下执行?

更确切地说 - 如何以标准方式做到这一点?

我喜欢我的程序引起的VS跟踪异常的方式,因此当从VS运行它时,我没有理由使用我自己的机制来处理和显示异常.当然,当程序作为独立应用程序执行时,我必须依赖我的异常处理程序.

我知道,我可以在VS中定义一个参数来运行程序,这样可以识别这是否是VS运行,但我正在寻找标准的东西.也许VS设置一个标志,表明这是VS运行?

c# debugging visual-studio

7
推荐指数
0
解决办法
6990
查看次数

如何避免WPF中事件的递归触发?

我有两个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的通用处理程序

A和B(在这种情况下)是滚动查看器,我尝试按比例保持两个相同的位置.该项目(由Karin Huber提供)在这里:http: //www.codeproject.com/KB/WPF/ScrollSynchronization.aspx

事件触发

阻止事件的想法非常受欢迎,我添加了触发事件的顺序,我们开始:

  • 我改变了A.
  • 调用一个处理程序
  • 我禁用了A的处理程序
  • 我改变了B(这是存储的,但没有触发)
  • 我启用了A的处理程序
  • 现在事件是从队列中获取的
  • 调用B处理程序
  • 我禁用B的处理程序
  • 我改变了A.
  • ...

如你所见,这是徒劳的.

c# wpf recursion events

7
推荐指数
1
解决办法
2974
查看次数

如何在WPF中获取与桌面相关的鼠标位置?

问题

当您使用谷歌搜索此类问题时,您会获得大量点击,但所有解决方案都假设您至少有一个窗口.

但我的问题就像我说的那样 - 根本不是假设.我可以有一个窗口,但我可以有零窗口(因为我甚至没有显示一个窗口,或者我只关闭了最后一个窗口).因此,简而言之,解决方案不能依赖于任何窗口小部件或窗口 - 唯一已知的是,是否存在桌面(和应用程序正在运行,但它没有任何窗口).

所以问题是 - 如何获得鼠标位置?

背景

我想显示以鼠标位置为中心的窗口.在WPF中没有这样的模式(只有所有者的中心,或者屏幕的中心)所以我必须手动完成.缺少的部分是鼠标位置.

编辑

谢谢大家,所以现在我有解决方案的第一部分 - 原始位置.现在有一个问题如何转换WPF的数据.我发现了这样一个主题: WPF像素到桌面像素, 但又一次,它假设有一些窗口.

然后我google了更多,我找到了解决方案:http: //jerryclin.wordpress.com/2007/11/13/creating-non-rectangular-windows-with-interop/

代码包括仅依赖于桌面信息的放大/缩小坐标的类.所以加入这两件,我终于得到了解决方案:-).再次感谢.

c# wpf mouse position

7
推荐指数
1
解决办法
1万
查看次数

如何在T4文本模板中使用自定义库/项目?

我看,我没有看到.

我有一个包含两个项目的解决方案 - 项目A(库)和项目B,它是主项目,包含T4文本模板.

到目前为止我做了什么 - 我在主项目中添加了一个项目A的引用.我在模板中包含了这样的行:

<#@ import namespace="MyProjectA" #>
Run Code Online (Sandbox Code Playgroud)

然而,仍然存在错误"编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少using指令或程序集引用?)"

问题:如何从文本模板引用项目A?

请注意:我想在解决方案中引用一个项目,而不是磁盘上的dll文件.

c# t4 reference

7
推荐指数
2
解决办法
5302
查看次数

如何将文件读入保存CR/LF的字符串?

如果我问"如何将文件读成字符串"的问题,那么答案就很明显了.然而 - 这里保留了CR/LF的捕获量.

问题是,File.ReadAllText剥离这些字符.StreamReader.ReadToEnd我刚刚将LF转换为CR导致我进行了长时间的调查,其中我有非常明显的代码中的错误;-)

因此,简而言之,如果我有一个包含文件foo\n\r\nbar我想获得foo\n\r\nbar(即内容完全一致),而不是foo bar,foobarfoo\n\n\nbar..Net空间中是否有一些可以使用的方法?

结果应该始终是单个字符串,包含整个文件.

c# string newline file carriage-return

7
推荐指数
2
解决办法
2万
查看次数

是否有开关禁用"无法在写入上下文中使用临时表达式"错误?

在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)

php

7
推荐指数
2
解决办法
1万
查看次数

如何使用SQL CE加速LINQ插入?

历史

我有一个"记录"列表(3,500),我保存到XML并在程序退出时压缩.以来:

  • 记录数量增加
  • 退出时只需要更新大约50条记录
  • 节省大约需要3秒钟

我需要另一个解决方案 - 嵌入式数据 我之所以选择SQL CE,是因为它与VS一起使用没有任何问题,许可证对我来说是好的(我把它比作Firebird,SQLite,EffiProz,db4oBerkeleyDB).

数据

记录结构: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)

.net c# linq optimization sql-server-ce

6
推荐指数
2
解决办法
1558
查看次数