我有一个类A,它有一个模板参数T.有一些用例,类T提供了一个函数func1(),并且有一些用例,其中T不提供它.A中的函数f()应该调用func1(),如果它存在的话.我认为这应该可以使用boost mpl,但我不知道如何.这里有一些伪代码:
template<class T>
class A
{
void f(T param)
{
if(T::func1 is an existing function)
param.func1();
}
};
Run Code Online (Sandbox Code Playgroud)
更好的是其他情况:
template<class T>
class A
{
void f(T param)
{
if(T::func1 is an existing function)
param.func1();
else
cout << "func1 doesn't exist" << endl;
}
};
Run Code Online (Sandbox Code Playgroud) 我有一个案例类,以Seq [T]作为参数:
case class MyClass(value: Seq[T])
Run Code Online (Sandbox Code Playgroud)
我现在希望能够写作
MyClass(t1,t2,t3)
Run Code Online (Sandbox Code Playgroud)
所以我定义了
object MyClass {
def apply(value: T*) = new MyClass(value.toSeq)
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为case类定义了
object MyClass {
def apply(value: Seq[T])
}
Run Code Online (Sandbox Code Playgroud)
并且擦除后Seq [T]和T*具有相同的类型,因此我不能使它们超载.
但是我想允许两种访问方式.应该允许两种方式:
MyClass(t1,t2,t3)
MyClass(some_seq_of_T)
Run Code Online (Sandbox Code Playgroud)
由于Seq [T]和T*几乎是相同类型(至少在擦除之后;并且在具有参数T*的函数内部变为Seq [T]),我认为应该有一种方法允许两种方式调用它.
在那儿?
我使用SBT创建了一个scala项目,并使用scalatest编写了一些单元测试用例.但不知何故sbt test找不到org.scalatest包.
这是我的项目定义文件:
src/main/scala respective src/test/scalabuild.sbt:
name := "MyProject"
version := "0.1"
scalaVersion := "2.9.2"
Run Code Online (Sandbox Code Playgroud)project/plugins.sbt:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.0")
Run Code Online (Sandbox Code Playgroud)project/build.sbt:
libraryDependencies += "org.scalatest" %% "scalatest" % "1.8" % "test"
Run Code Online (Sandbox Code Playgroud)我正在使用SBT 0.11.3.
sbt compile在控制台上使用编译程序工作正常.此外,我发现了scalatest jar ~/.ivy2,所以SBT必须下载它.
但sbt test它说,在跑步时
object scalatest is not a member of package org
[error] import org.scalatest.FlatSpec
...[many errors alike]
Run Code Online (Sandbox Code Playgroud)
并且运行sbt eclipse会创建一个不包含scalatest jar的.class路径.
我是否必须在其他地方指定测试依赖项?我该如何添加scalatest库?
我正在为Internet Explorer编写一个浏览器帮助程序对象,需要在硬盘上存储一些数据.是否有约定,存储此文件的位置?或者如果不是 - 我可以写入哪个目录(临时文件夹除外)?
我是scala宏的新手,我正在使用scala 2.10.0-RC3.
我想编写一个向类添加函数的宏.用法示例:
trait MyTrait {
def addF = macro { /*add "def f = 3" to class*/ }
}
class MyClass extends MyTrait {
addF //Adds the "def f" to MyClass
}
object Main {
val t = new MyClass
assert(t.f==3)
}
Run Code Online (Sandbox Code Playgroud)
我在以下场景中需要这个.我的第一次尝试没有使用宏但没有用,因为我不能继承两次相同的特性.
trait AddF[T] {
def f(t: T) { /* ...do sthg ... */ }
}
class MyClass extends AddF[Int] with AddF[String]
Run Code Online (Sandbox Code Playgroud)
使用宏解决方案,我可以写
class MyClass extends MyTrait {
addF[Int]()
addF[String]()
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用scala宏做到这一点?或者有另一种方法来实现这一目标吗?
我写了一个需要发送电子邮件的 C++ 应用程序。
它通过调用
/usr/sbin/sendmail -f [sender] -t
Run Code Online (Sandbox Code Playgroud)
然后将邮件标题和正文写入 sendmail 进程的标准输入。
一切正常 - 除了变音或其他非 ASCII 字符。我怎样才能让它们正常工作?
我已经尝试设置
Content-Type: plain-text; charset=ISO-8859-1
Run Code Online (Sandbox Code Playgroud)
作为邮件标题,也
Content-Type: plain-text; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
没有改变任何东西。似乎这个标题被忽略了。
我想编写一个枚举,只是将一个Input.El推入迭代,然后返回剩余的iteratee.我把它称为prepend,因为它只是通过为它添加一个值来改变流.这是我的尝试:
object Enumeratees {
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我现在通过它来称呼它
Enumerator(1,2,3,4) |>> (Enumeratees.prepend(0) &>> Iteratee.foreach[Int]{i=>println(i)})
Run Code Online (Sandbox Code Playgroud)
它只打印应该预先添加的0.枚举器中的其他值将被忽略.如果我也覆盖枚举的&>方法(转换方法),我可以使它工作:
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}
override def transform[A](inner: Iteratee[T,A]): Iteratee[T,A] =
Iteratee.flatten(inner.feed(Input.El(toPrepend)))
}
Run Code Online (Sandbox Code Playgroud)
但这不是一种非常干净的方式,因为applyOn方法仍然无效.我想我错误地认识了applyOn方法的含义.在我看来,它应该返回一个返回原始iteratee的iteratee,然后在原始iteratee上继续输入.
上面的转换方法应该解释一下,我想从我的枚举中得到什么样的行为.如何通过覆盖applyOn而不是transform来实现这种行为?
我正在管理一个Web平台,并希望获取一些统计数据,这些数据来自我的用户。我可以存储远程IP,并且我知道有些本地化服务可将IP映射到地理位置。
该映射如何完成?是否有固定表,哪个IP地址分配给哪个区域?
我必须在访问时请求映射,还是可以在几天/几个月/年后请求它?换句话说:从IP到位置的映射是固定的还是随时间变化的?
我想使用 joda 库(在 Scala 中,但应该与 java 相同)解析 DateTime。
来源看起来像
val dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z")
val date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST")
Run Code Online (Sandbox Code Playgroud)
在 Java 中,这看起来像
DateTimeFormatter dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z");
DateTime date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST");
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,但会引发异常:
java.lang.IllegalArgumentException: Invalid format: "2012-08-28 15:35:00 CEST" is malformed at "CEST"
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?当然我可以忽略“CEST”部分而只解析其余部分,但在输入中“CEST”有时可以替换为“CET”,所以我不想忽略它。
我在dev和prod模式下使用(成功)flyway-play插件.我也想在测试模式下使用它.文档说,它在测试模式下自动运行迁移.
我使用scala测试,我的测试用包裹在假的应用程序中
val fakeApplication = FakeApplication(additionalConfiguration = Map(
"db.default.driver"->"org.h2.Driver",
"db.default.url"->"jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;",
"db.default.user"->"",
"db.default.password"->""
))
Run Code Online (Sandbox Code Playgroud)
运行测试用例时,自动迁移失败并显示"Schema public not found":
[info] com.googlecode.flyway.core.command.FlywaySqlScriptException: Error executing statement at line 17: CREATE TABLE "public"."schema_version" (
[info] "version_rank" INT NOT NULL,
[info] "installed_rank" INT NOT NULL,
[info] "version" VARCHAR(50) NOT NULL,
[info] "description" VARCHAR(200) NOT NULL,
[info] "type" VARCHAR(20) NOT NULL,
[info] "script" VARCHAR(1000) NOT NULL,
[info] "checksum" INT,
[info] "installed_by" VARCHAR(100) NOT NULL,
[info] "installed_on" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
[info] "execution_time" INT NOT NULL,
[info] …Run Code Online (Sandbox Code Playgroud) scala ×5
bho ×1
boost ×1
boost-mpl ×1
c++ ×1
datetime ×1
diacritics ×1
enumerator ×1
flyway ×1
geolocation ×1
h2 ×1
ip ×1
iterate ×1
java ×1
jodatime ×1
overloading ×1
play-slick ×1
postfix-mta ×1
reflection ×1
sbt ×1
scala-2.10 ×1
scala-macros ×1
scalatest ×1
sendmail ×1
sfinae ×1
slick ×1
smtp ×1
type-erasure ×1
types ×1
utf-8 ×1
winapi ×1