通过Scala 2.8 Predef类,我发现有一种"本地"方法.尽管我可以说,它与Predef.identity相同,只是有"@inline"注释.它有什么用,为什么它在Predef中很重要(因此可以在Scala的任何地方使用)?
如何在Scala中定义类型?喜欢
type MySparseVector = [(Int, Double)]
Run Code Online (Sandbox Code Playgroud)
在哈斯克尔或
typedef MySparseVector = std::list<std::pair(int, double)>>
Run Code Online (Sandbox Code Playgroud)
在C++中?
我试过了
type MySparseVector = List((Int, Double))
Run Code Online (Sandbox Code Playgroud)
但无法弄清楚如何使其发挥作用.如果我在类文件的开头写这个,我得到"预期的类或对象定义"错误.
PS对不起,我输错了.我试图在Scala中使用List [(Int,Double)].
在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(Amazon SimpleDB偶尔会返回503并需要重试.)
当我尝试编译时,Scala抱怨道recursive method simpledb_update needs result type.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
try {
db(config("simpledb_db")) += (name, metadata)
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
}
}
Run Code Online (Sandbox Code Playgroud)
为什么递归函数需要这个?我的想法是只返回一个true/false布尔值来满足编译器...以下编译很好.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, …Run Code Online (Sandbox Code Playgroud) 如果我有:
val f : A => B => C
Run Code Online (Sandbox Code Playgroud)
这是以下的简写:
val f : Function1[A, Function1[B, C]]
Run Code Online (Sandbox Code Playgroud)
如何获得g带签名的功能:
val g : (A, B) => C = error("todo")
Run Code Online (Sandbox Code Playgroud)
(即)
val g : Function2[A, B, C] //or possibly
val g : Function1[(A, B), C]
Run Code Online (Sandbox Code Playgroud)
在f?
我在构造函数上使用Scala 2.8默认参数,出于Java兼容性原因,我想要一个使用默认参数的无参数构造函数.
这不是出于非常明智的原因:
class MyClass(field1: String = "foo", field2: String = "bar") {
def this() = {
this() // <-- Does not compile, but how do I not duplicate the defaults?
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何我想念的东西.任何不需要重复参数默认值的想法?
谢谢!
所以对于一个非常小的公式解释者,有人问我打码 - 高尔夫,我想做点什么
val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> / )
Run Code Online (Sandbox Code Playgroud)
允许关键字与其描述的功能之间的快速转换.这个语法不仅没有解析,也没有我试过(_ + _,_:Int.+_)解析的其他简写语法.有没有办法把它作为一种功能简写,或者我注定要完全写出lambdas,毁了我的高尔夫球得分.
编辑:问题只是整数.据我所知,超载会使这更加困难.
我希望能够将使用setter注入的Spring用于Scala组件.不幸的是,Scala的本地setter的命名与JavaBeans标准不同,foo_=而不是setFoo.Scala确实为此提供了几种解决方法,注释强制创建JavaBeans setter/getter以及本机Scala,但这需要注释我想要注入的每个组件.更方便的是BeanWrapper用一个知道如何处理Scala风格的getter和setter的方法覆盖Spring使用的方法.
似乎没有任何关于如何做这样的事情的文件,或者它是否可行,也没有其他任何人做过的在线例子.所以在深入研究之前,我想我会在这里查看
请看一下下面的代码,其中Extractor[A,B]是通用框架的一部分,其他一切应该被视为"客户端代码"(我把它煮了很多,并重命名为所有内容.所以不要介意Extractor似乎没有太有用了).
scala> abstract class Extractor[A,B] {
| def extract(d:A):B
| def stringRepr(d:A):String
| }
defined class Extractor
scala> sealed abstract class Value
defined class Value
scala> case class IntValue(i:Int) extends Value
defined class IntValue
scala> case class StringValue(s:String) extends Value
defined class StringValue
scala> case class Data(i:Int, s:String)
defined class Data
scala> sealed abstract class MyExtractor[Value] extends Extractor[Data, Value] {
| def stringRepr(d:Data) = extract(d) match {
| case IntValue(i) => i.toString
| case StringValue(s) => …Run Code Online (Sandbox Code Playgroud) 虽然与Java相比,从Doubles到BigDecimals 的转换情况有所改善
scala> new java.math.BigDecimal(0.2)
res0: java.math.BigDecimal = 0.20000000000000001110223024625156...
scala> BigDecimal(0.2)
res1: scala.math.BigDecimal = 0.2
Run Code Online (Sandbox Code Playgroud)
等等
val numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1)
Run Code Online (Sandbox Code Playgroud)
工作得很好,有一个隐含的转换是不合理的
implicit def String2BigDecimal(s: String) = BigDecimal(s)
Run Code Online (Sandbox Code Playgroud)
默认情况下可以将字符串转换为BigDecimals吗?
val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")
Run Code Online (Sandbox Code Playgroud)
还是我失去了一些东西和Scala解决Java的所有"问题"使用的BigDecimal构造与浮点值,而不是一个String,并且BigDecimal(String)基本上不斯卡拉不再需要?
我有大量简单的命令行 Scala 应用程序,它们共享相当多的通用结构。它们都继承自scala.App,这很好。我想将这些命令行应用程序的共享结构重构为一个共同的特征,然后我可以将其继承到我的(更简单的)命令行应用程序类中。问题的出现是因为一些公共结构包括命令行参数的解析。
object MyScript extends BaseScript with App{
//small bits of business logic using components defined in BaseScript
}
trait BaseScript extends App{
val configuration = loadConfiguration(args(0))
//setup a bezillion components, usable from any of the scripts, based on the configuration
}
Run Code Online (Sandbox Code Playgroud)
它可以编译,但在实际取消引用时会失败并出现 NPE args,大概是因为该App特征尚未初始化。更改特征顺序并将 BaseScript 中 App 的继承更改为自类型声明不会执行任何操作,就像使用 DelayedInit 进行的实验一样。在 BaseScript 中将组件声明为“惰性”组件是可行的,但我也希望在初始化期间需要实际使用这些组件(例如,设置日志目录并根据配置加载 JDBC 驱动程序类),因此会失去惰性的好处。我可以做些什么来使命令行参数在 BaseScript 特征中可见并初始化吗?