愚蠢的问题,但这些例子都不适合我; 经典文章" 皮条客我的图书馆 "是错误的,甚至最简单的代码也有问题.
顺便说一句.我假设您必须在对象中放置转换方法(很多片段都省略了该部分).根据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.
考虑这样的代码(这只是示例而不是真正的代码):
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重复了同样的错误?我想知道.
该代码仅用于说明目的,即它是一个不是真实代码的示例.
我试过这个:
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)
但这一切都不起作用 - 我需要一个生成器,定义和一个声明 - 这是否可以用收益率来做到这一点?如果是,那么正确的语法是什么?
在有限的意义上,你自己编写out
和编写它很容易ref
,但我的问题不是如何做 - 但是有一些功能(或类)可以使用吗?
我发现最接近的是Reference
特质(但它是一种特质).
我需要那些,而不是元组,不是选项,而不是纯粹的结果,因为只有ref/out才能使链接优雅.
我是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.maxGridSize
和props.maxThreadsDim
我以类似的方式计算块和线程的维度 - 来自total_blocks
和threads_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) 考虑这样的课程:
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
因为它们是引用值(这是真的吗?静态字段怎么样?).
我不知道Go,我只是研究各种语言的语法.
来自Go常见问题解答:"从BCPL借用一个技巧:分隔语句的分号在正式语法中,但是在任何一行语句结尾处的词法分析器自动注入,而不是前瞻性."
我想知道它是如何完成的,我看了看lex.go
但也许我不知道Go足够(实际上很少)但是我没有找到任何对"声明"或"分号"的引用.
那么 - 如何在lexer阶段结束时检测到有效语句甚至没有预测?
我有几个具有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次时发现副作用.
在我之前的问题中:如何在BroadcastReceiver中保留和访问数据?我有很好的答案,但在这里我专注于此.
有BroadcastReceiver,有服务.我想从接收器发送一些数据到服务并获取数据.发起转移的一方是接收方,而不是服务方.
为了简单起见,假设接收者等待SCREEN_ON然后询问服务"这是用户的生日",服务器返回true或false.
如果我没有弄错的话,我应该将我的数据附加到Service的Intent,然后调用startService
,但是如何获取数据?