小编gre*_*man的帖子

你如何以现代方式定义隐式转换?

愚蠢的问题,但这些例子都不适合我; 经典文章" 皮条客我的图书馆 "是错误的,甚至最简单的代码也有问题.

顺便说一句.我假设您必须在对象中放置转换方法(很多片段都省略了该部分).根据PiS的书,似乎挂隐式def是可以的,但这也给了我错误.

object Minutes
{
  implicit def toMinutes(x : Int) = new Minutes(x)
}

class Minutes(private val x : Int)
{
  def minutes = x.toString+"m"
}

object MainApp {

  def main(args : Array[String])
  {
     println(5.minutes)
     ...
Run Code Online (Sandbox Code Playgroud)

错误 - "值分钟不是Int的成员".

我错过了什么?Scala 2.9.1.

scala implicit implicit-conversion

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

构造函数参数在整个类中是可见的 - 一个功能还是一个bug?

考虑这样的代码(这只是示例而不是真正的代码):

class Foo(url : String) extends Bar(url)
{
  def say() { println(url) }
}
Run Code Online (Sandbox Code Playgroud)

它编译并且有效.无意义的结果"当然".我太新手无法判断,但对我而言,它没有任何意义,只有混乱 - 根据定义,构造函数的参数不可能直接在另一种方法中获得.

有人在Scala中有更多经验可以指出它可能有效还是有意义的条件?或者确认我怀疑这是当前Scala编译器中的缺陷.

更新

class Bar(val Url : String)
{
}
Run Code Online (Sandbox Code Playgroud)

为什么"胡说八道".因为我的遗嘱(在Foo中没有"var"和"val")只是传递参数,没有别的.因此,当我实际使用构造函数参数时,我只是错误地使用什么实体.当你故意写作时,你每次都会获得累积奖金,但如果你没有(即拼写错误),你可以随机使用实体.这不是代码没有意义,它是计算只是没有意义,我也可以掷骰子.有一个方法范围,我没有看到为什么不应该有构造函数范围的原因.

更新 - 解决方法

所以这个邪恶的构造似乎真的是语言的一部分(按设计).正如UserUnknown和Tomasz Nurkiewicz所说,反对制作愚蠢错字的唯一防线就是惯例,但是低于大写的情况并不好."A"和"a"差别很大,但"U"和"u"并不多.引入一个特殊字符(如Tomasz所示)要好得多,因为可以直观地检测构造函数参数的可疑用法.

我将使用"$"作为"只传递"构造函数参数,为我输入更难,并且您在代码中不会经常看到此字符.

谢谢你的答案!

为什么它是邪恶的?因为用户应该明确允许隐式操作 - 好的例子在C#中是"动态的",在Scala中是隐式转换.打破这个导致大量问题的规则的例子是 - 在C++中隐式转换为bool,在C++中隐式构造函数,在Perl中使用声明.而这个特殊情况非常非常接近所提到的perlism,在Perl中,最终解释器发生了变化以检测这种错误,为什么Scala重复了同样的错误?我想知道.

constructor scope arguments scala

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

如何使用多语句的收益率?

该代码仅用于说明目的,即它是一个不是真实代码的示例.

我试过这个:

val results = for(i <- 1 to 20)
{
  val x = i+1
  println(x)
  yield x
}
Run Code Online (Sandbox Code Playgroud)

还有这个

val results = for {i <- 1 to 20;
  val x = i+1;
  println(x)
}
  yield x
Run Code Online (Sandbox Code Playgroud)

但这一切都不起作用 - 我需要一个生成器,定义和一个声明 - 这是否可以用收益率来做到这一点?如果是,那么正确的语法是什么?

for-loop scala yield

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

在Scala中模仿C#out和ref - 准备使用功能?

在有限的意义上,你自己编写out和编写它很容易ref,但我的问题不是如何做 - 但是有一些功能(或类)可以使用吗?

我发现最接近的是Reference特质(但它是一种特质).

我需要那些,而不是元组,不是选项,而不是纯粹的结果,因为只有ref/out才能使链接优雅.

scala ref out

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

如何计算哪个SM给定线程正在运行?

我是CUDA初学者.

到目前为止,我了解到,每个SM都有8个块(线程).假设我有简单的工作将数组中的元素乘以2.但是,我的数据少于线程.

不是问题,因为我可以切断线程的"尾部"以使它们闲置.但是,如果我理解正确,这将意味着一些SM将获得100%的工作,而某些部分(甚至没有).

因此,我想计算哪个SM正在运行给定线程并以这种方式进行计算,每个SM具有相同的工作量.

我希望它首先有意义:-)如果是这样,如何计算给定线程运行哪个SM?或者 - 当前SM的索引和它们的总数?换句话说,在SM术语中等效于threadDim/threadIdx.

更新

评论太久了.

罗伯特,谢谢你的回答.当我试图消化所有,这里是我做的-我有一个"大"数组,我只是有乘以值*2和它(存储阵列输出作为热身,顺便说一句我做所有的计算,数学上是正确的. ).所以首先我在1个块,1个线程中运行它.精细.接下来,我尝试以这样的方式拆分工作,即每个乘法只由一个线程完成一次.结果我的程序运行速度慢了大约6倍.我甚至感觉到为什么-小罚获取有关GPU的信息,然后计算有多少块和线程我应该使用,则每个线程,而不是单一的乘法中,现在我身边有10多只的乘法计算阵列中的偏移量一个线程.一方面,我试图找出如何改变这种不受欢迎的行为,另一方面,我想在SM中均匀地传播线程的"尾部".

我改写 - 也许我错了,但我想解决这个问题.我有1G小工作(*2就是全部) - 我应该用1K线程创建1K块,或者用1个线程创建1M块,用1M线程创建1块,依此类推.到目前为止,我读取了GPU属性,除法,除法,并盲目地使用网格/块的每个维度的最大值(如果没有要计算的数据,则使用所需的值).

代码

size是输入和输出数组的大小.一般来说:

output_array[i] = input_array[i]*2;
Run Code Online (Sandbox Code Playgroud)

计算我需要多少块/线程.

size_t total_threads = props.maxThreadsPerMultiProcessor
                       * props.multiProcessorCount;
if (size<total_threads)
    total_threads = size;

size_t total_blocks = 1+(total_threads-1)/props.maxThreadsPerBlock;

size_t threads_per_block = 1+(total_threads-1)/total_blocks;  
Run Code Online (Sandbox Code Playgroud)

拥有props.maxGridSizeprops.maxThreadsDim我以类似的方式计算块和线程的维度 - 来自total_blocksthreads_per_block.

然后是杀手部分,计算线程的偏移量(线程内部):

size_t offset = threadIdx.z;
size_t dim = blockDim.x;
offset += threadIdx.y*dim;
dim *= blockDim.y;
offset += threadIdx.z*dim;
dim *= blockDim.z; …
Run Code Online (Sandbox Code Playgroud)

cuda nvidia

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

如何标记可从主机和设备调用的函数?

我有一堆像普通的功能swap,min,max等.如何纪念他们,所以我可以从两个主机和从设备给他们打电话?

cuda

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

在泛型类实例化上创建了多少个实例?

考虑这样的课程:

class Foo<T>
{
   private T myField;
   public void Set(T x)
   {
      myField = x;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后用T等于int,bool(值类型)和String,实例化它List.

如何创建实例化以及它们的外观?

我对Java和C#感兴趣.

从我读到的内容中,Java将创建一个基本类型的通用类,而在C#中将有两个类int,bool加上单个类String,List因为它们是引用值(这是真的吗?静态字段怎么样?).

c# java generics instantiation

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

Go lexer中如何检测语句的结尾?

我不知道Go,我只是研究各种语言的语法.

来自Go常见问题解答:"从BCPL借用一个技巧:分隔语句的分号在正式语法中,但是在任何一行语句结尾处的词法分析器自动注入,而不是前瞻性."

我想知道它是如何完成的,我看了看lex.go但也许我不知道Go足够(实际上很少)但是我没有找到任何对"声明"或"分号"的引用.

那么 - 如何在lexer阶段结束时检测到有效语句甚至没有预测?

syntax go lexer

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

发送通知时如何避免丢失接收方?

我的程序如何工作

我有几个具有PropetyChanged事件的对象的后端.更改某些属性后,将触发通知.在前端,我有用WPF编写的GUI,并且几个属性直接绑定到WPF小部件.

为了使GUI响应,所有计算都在另外的线程中完成.

所以,一般来说,经典的WPF应用程序.

错误

public void OnPropertyChanged(string name)
{
  if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(name)); // (*)
}
Run Code Online (Sandbox Code Playgroud)

此代码发送通知,但它会在(*)处抛出异常,因为PropertyChanged为null(是的,检查null之后).

我的猜测是因为在WPF中重新绑定 - 在我的代码中我更改了发件人,因此WPF必须取消注册接收器并将其注册到新发件人.很少抛出异常(我每次执行约40000次执行一次异常,每次执行大约相当于发送者的一次更改)但确实发生了.

现在 - 如何正确锁定PropertyChange,所以我可以检查null并将通知作为原子操作发送?我不想通过反复试验来做到这一点,因为我可以在每次执行第1M次时发现副作用.

c# events multithreading

0
推荐指数
1
解决办法
71
查看次数

如何在Service和BroadcastReceiver之间发送和获取数据?

在我之前的问题中:如何在BroadcastReceiver中保留和访问数据?我有很好的答案,但在这里我专注于此.

有BroadcastReceiver,有服务.我想从接收器发送一些数据到服务并获取数据.发起转移的一方是接收方,而不是服务方.

为了简单起见,假设接收者等待SCREEN_ON然后询问服务"这是用户的生日",服务器返回true或false.

如果我没有弄错的话,我应该将我的数据附加到Service的Intent,然后调用startService,但是如何获取数据?

service android broadcastreceiver

0
推荐指数
1
解决办法
3395
查看次数