在今天的代码审查中,我偶然发现了以下一些代码(稍微修改后发布):
while (!initialized)
{
// The thread can start before the constructor has finished initializing the object.
// Can lead to strange behavior.
continue;
}
Run Code Online (Sandbox Code Playgroud)
这是在新线程中运行的前几行代码.在另一个线程中,一旦初始化完成,它就会设置initialized为true.
我知道优化器可以将其变成无限循环,但是避免这种情况的最佳方法是什么?
volatile- 被认为有害isInitialized()函数而不是直接使用变量 - 这会保证内存障碍吗?如果宣布该功能inline怎么办?还有其他选择吗?
编辑:
应该早点提到这一点,但这是需要在Windows,Linux,Solaris等上运行的可移植代码.我们主要使用Boost.Thread作为我们的便携式线程库.
我在Scala 中使用Mapper创建了一个表.
class Stage extends Mapper[Stage]
{
def getSingleton = Stage
object controlId extends MappedLongForeignKey (this,Control) {
override def dbNotNull_? = true
override def dbColumnName = "control_id"
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的表没有为数据库中的foreignKey键创建约束.
我有一个 Scala 问题。想象一下您正在构建代码来处理不同的操作,即
operation match {
case A => doA()
case B => doB()
case _ => throw new Exception("Unknown op: " + operation)
}
Run Code Online (Sandbox Code Playgroud)
现在,想象一下,稍后您想要构建一个新版本,并且想要扩展操作 C 的模式匹配。如何以操作分辨率仍然为 O(1) 的方式做到这一点?
我的意思是,我可以修改上面的代码来执行以下操作:
case _ => handleUnknownOperation(operation)
Run Code Online (Sandbox Code Playgroud)
子类可以实现handleUnknownOperation来执行以下操作:
operation match {
case C => doC()
}
Run Code Online (Sandbox Code Playgroud)
但这很糟糕,因为这意味着 C 操作需要 O(2)。
扩展这种模式匹配结构的任何其他想法或最佳实践?
干杯,高尔德
scala> abstract class Foo {
| type Repr_Tpe <% Ordered[Repr_Tpe]
| }
<console>:2: error: `=', `>:', or `<:' expected
Run Code Online (Sandbox Code Playgroud)
OP表示用类型参数替换抽象类型不是一种选择.有没有办法表达一个抽象类型的视图?
我正在尝试使用CSS Selector Transforms来完成一些Lift示例.我正在尝试这种转变:
- NodeSeq => NodeSeq - 一个转换节点的函数(是的,它可以是一个CssBindFunc):
"#name" #> ((n: NodeSeq) => n % ("class" -> "dog")) // <span id="name"/> -> <span id="name" class="dog"/>
这就是%现在给我带来麻烦的.当我尝试编写这样的代码时,我得到了错误value % is not a member of scala.xml.NodeSeq.是否有进口或我缺少的东西?
这是我的片段:
import scala.xml._
import net.liftweb.util.Helpers._
import model.User
class Users {
def show = {
".userName" #> "name replaced" &
".userEmail" #> "email replaced" &
".changePassword" #> ((n: NodeSeq) => n % ("href" -> "changePassword"))
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Web服务客户端,他们在第一次调用时速度很慢.而不是总是创建一个全新的,我想使用演员并说5个演员来包装Web服务客户端.由于Web服务客户端不是线程安全的(至少使用我用来生成它们的库),这非常有意义.
我想到有一个父母演员将这个工作交给五个工人,一个接一个地以循环方式.
但最好简单地交给第一个可用的.我可以在父演员中跟踪该状态,但我想知道这样的事情是否可以更简单地完成并且它是否已经被框架支持了?
我使用的是简单的scala演员,而不是AKKA,但我对所有建议持开放态度.
谢谢.
我需要使用scala执行脚本.当我执行Seq使用!新行丢失后的字符串.那就是"这是"字符串在新行丢失后更新为Jira和字符串的另一部分.据我所知,这是应该的!不保持新的路线.任何人都可以建议我如何解决这个问题?请参阅下面的代码.
import scala.sys.process._
val fileContent: String = """ Here is the
text with
new line """
Seq("/opt/atlassian-cli-2.6.0/atlassian.sh", "jira", "--action", "updateIssue", "--issue", "JIRA-2", "--field", "customfield_10664" ,"--values", fileContent).!
Run Code Online (Sandbox Code Playgroud) 我为什么要这么做
trait Compiler {
var printInstruction: String
}
class JavaCompiler extends Compiler {
var printInstruction = "System.out.print(arg0);"
}
Run Code Online (Sandbox Code Playgroud)
代替
trait Compiler {
var printInstruction: String
}
class JavaCompiler extends Compiler {
printInstruction = "System.out.print(arg0);"
}
Run Code Online (Sandbox Code Playgroud)
什么时候
trait Compiler {
var printInstruction: String
def printInstruction: String
}
Run Code Online (Sandbox Code Playgroud)
给出编译错误.
我在scala中有这样的东西:
abstract class Point[Type](n: String){
val name = n
var value: Type = _
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.问题出在一个扩展Point的类中.
case class Input[Type](n:String) extends Point(n){
def setValue(va: Type) = value = va
}
Run Code Online (Sandbox Code Playgroud)
在setValue行我有这样的问题:
[error] type mismatch;
[error] found : va.type (with underlying type Type)
[error] required: Nothing
[error] def setValue(va: Type) = value = va
Run Code Online (Sandbox Code Playgroud)
我曾尝试与初始化null和null.asInstanceOf[Type],但结果是一样的.
如何初始化值以便可以在setValue中使用?
我试图解决以下问题从Scala不耐烦.问题如下:
使用模式匹配,编写一个函数交换,交换数组的前两个元素,前提是它的长度至少为2.
我的解决方案是:
def swap(sArr:Array[Int]) = sArr.splitAt(2) match {
case (Array(x,y),Array(z)) => Array(y,x,z)
case (Array(x,y),Array()) => Array(y,x)
case _ => sArr
}
Run Code Online (Sandbox Code Playgroud)
我的问题是第一个案例陈述.我认为它会模式匹配,(Array(1,2),Array(3))而我打算模式匹配(Array(1,2),Array(3,4,5.....))
有人可以指出这是可能的.
谢谢
我知道这是可能的,但我对C++的经验不足限制了我.我想要做的是有一些系统,我可以添加update()方法到某些类,并在程序中的每个帧调用所有更新方法.
Unity3D用户可能对此很熟悉.但是,如果Update()在未确定的类中存在未确定数量的方法,程序如何知道调用每个方法.
我想这是一个在整个程序中动态调用函数的系统.
它产生的错误是:
Funct.scala:5: 'val' expected but identifier found.
[error] class Funct[In,Out](function: In => Out, description: String, implicit m: Manifest[In => Out]) {
Run Code Online (Sandbox Code Playgroud)
并且有问题的代码是:
import scala.reflect.Manifest;
class Funct[In,Out](function: In => Out, description: String, implicit m: Manifest[In => Out]) {
def isType[K](implicit man: Manifest[K]) = {
m <:< man
}
def Apply(input: In): Out = {
function.Apply(input)
}
def toString() = {
description + m
}
}
Run Code Online (Sandbox Code Playgroud)
我根本看不出问题所在.