我从一些人那里听说,在Scala中,我们倾向于(像其他函数式语言一样)不打破控制流...相反,按惯例,我们返回错误Either Left.
但是我们如何从这个例外中得到stracktrace呢?现在我在左边返回一个Error带有代码,消息和原因的简单案例类(Error也是).但如果我有错误,我无法获得堆栈跟踪.如果我的应用程序变得复杂,可能很难找到返回的代码块Error......根本原因是必不可少的.
那么我们在实践中做了什么?
我应该返回,而不是自定义Error,java类型Exception或Throwable我的Left?在不丢失堆栈跟踪和原因等重要信息的情况下,Scala异常处理的最佳实践是什么?
我已经安装的Android SDK + ANT +科尔多瓦(3.4.1)+设置PATH变量(android,ant,cordova命令可用)
在cordova CLI的最后,有这样的例子:
Example usage
$ cordova create Baz
$ cd Baz
$ cordova platform add android
$ cordova build
$ cordova serve android
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个例子:
sebastien@sebastien-xps:Desktop$ cordova create Baz
Creating a new cordova project with name "HelloCordova" and id "io.cordova.hellocordova" at location "/home/sebastien/Desktop/Baz"
Run Code Online (Sandbox Code Playgroud)
sebastien@sebastien-xps:Desktop$ cd Baz
Run Code Online (Sandbox Code Playgroud)
sebastien@sebastien-xps:Baz$ cordova platform add android
Creating android project...
Creating Cordova project for the Android platform:
Path: platforms/android
Package: io.cordova.hellocordova
Name: HelloCordova
Android target: …Run Code Online (Sandbox Code Playgroud) 有没有办法实现方法参数解构,但也能得到方法参数.
在具有无状态组件的React应用程序的上下文中,我希望能够替换
const MyComponent = (props) => {
const {prop1, prop2} = props;
return (
<div className={prop1 + '-' + prop2}>
<Child {...props}/>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
用更简洁的语法
const MyComponent = (props: {prop1, prop2}) (
<div className={prop1 + '-' + prop2}>
<Child {...props}/>
</div>
)
Run Code Online (Sandbox Code Playgroud)
有没有这样的语法?
您可能知道,有些人使用Enum of 1实例声明单例,因为JVM保证总是会有一个没有并发问题的实例来处理...
那么具有多个实例的枚举呢?我们可以说像Enum这样的东西是一种有序的单身人士共享一个共同的界面吗?为什么?
public enum EnumPriceType {
WITH_TAXES {
@Override
public float getPrice(float input) {
return input*1.20f;
}
public String getFormattedPrice(float input) {
return input*1.20f + " €";
}
},
WITHOUT_TAXES {
@Override
public float getPrice(float input) {
return input;
}
},
;
public abstract float getPrice(float input);
public static void main(String[] args) {
WITH_TAXES.getFormattedPrice(33f);
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,为什么这不起作用:WITH_TAXES.getFormattedPrice(33f); 如果不通过公共接口无法调用公共方法,那么声明公共方法的兴趣是什么?我想这就是为什么我没有看到任何语法能够为Enum的一个实例声明一个接口.
编辑:
似乎枚举实例是一种特殊的匿名类.因此,我理解为什么你不能称之为该方法.
我的问题有点与:为什么匿名类不能实现一个接口(除了它可能已经实现的接口!)
我完全理解为什么我们不能这样做:
Vehicle veh = new Vehicle() {
public String getName() {
return "toto";
}
}; …Run Code Online (Sandbox Code Playgroud) 我们知道,在使用hibernate对数据库进行批量更新时(即使在HQL中),所做的更改不会复制到当前会话中存储的实体.
所以我可以调用session.refresh来加载我的会话实体的修改.
我们经常调用flush来将修改发送到DB,但文档说它"同步"会话和db ...
这是否意味着flush能够为我的会话实体设置好的新db值?或者flush会最终使用存储在实体中的旧数据库擦除我的新数据库值?(顺便说一句,如果hibernate的行为是第一个,它如何检测哪一个是"好的价值"?).
如果我不能在这种情况下使用flush,最好在每次批量更新后清除会话,以便我们确保在会话中有良好的值?
我不习惯处理Java中的Soft和Weak引用,但我理解这个原理,因为我习惯于处理像Gemfire这样的数据网格,它在内存已满时提供溢出到hdd功能,可能使用软引用或类似的东西我猜测.
在番石榴中我不明白的是它提供了使键变软/弱的方法,以及值软/弱的方法.
我只是想知道用非软值创建软键的例子是什么意思?我的意思是,当开始收集软引用时,我们无法通过其键找到条目,那么为什么我们希望这些值保留在地图中?
有人可以给我们一些用例:
谢谢
编辑 我不确定我的问题是否足够精确,所以我想知道的是:
编辑: 正如Kevin Bourillon的回答所讨论的,最后我想我明白为什么使用软键并不意味着什么.原因如下:
static class KeyHolder {
final private String key;
public KeyHolder(String key) {
this.key = key;
}
public String getKey() {
return key;
}
@Override
public boolean equals(Object o) {
KeyHolder that = (KeyHolder)o;
boolean equality = this.getKey().equals(that.getKey());
return equality;
}
@Override
public int hashCode() {
return key != null ? key.hashCode() : 0;
}
@Override
public String toString() {
return "KeyHolder{" + …Run Code Online (Sandbox Code Playgroud) 我正在开发一个工业化的大型maven项目,在应用程序模块上,我需要能够向Android发送推送通知(使用新的Google云消息传递).
似乎谷歌提供自己的服务器端库来发送通知,并根据邮件列表,他们不提供任何maven存储库.
谷歌文档中提到的第一步是:
Copy the gcm-server.jar file from the SDK's gcm-server/dist directory to your server classpath.
Run Code Online (Sandbox Code Playgroud)
我不会这样做所以我已经将jar添加到我的本地存储库并将其添加到我们的企业Nexus.
mvn install:install-file
-Dfile=gcm-server.jar
-Dsources=gcm-server-sources.jar
-DgroupId=com.google.android.gcm
-DartifactId=gcm-server
-Dversion=r3
-DgeneratePom=true
-Dpackaging=jar
Run Code Online (Sandbox Code Playgroud)
但我刚刚注意到该库有依赖(simple-json,mockito和junit).它不是精确的,如果它们是运行时或测试,但我想在运行时只使用simple-json.我想从Nexus中检索GCM依赖还应该允许检索像这个simple-json lib这样的传递依赖吗?
那我该怎么办?我应该自己创建一个我不拥有的项目的pom文件,然后将项目导入我的maven存储库-DpomFile=my-custom-pom.xml吗?
谢谢
我想知道是否有可能创建某种"方法调用链",所有方法都返回相同的[错误,结果].
我想要做的是:连续调用所有方法,当方法返回一个Left(错误)时,然后停止方法调用并返回在调用链中找到的第一个Left.
我尝试了一些东西,包括折叠,地图,投影......但我是Scala的新手并没有找到任何优雅的解决方案.
我试过这样的事情:
def createUserAndMandatoryCategories(user: User) : Either[Error,User] = {
User.create(user).right.map {
Logger.info("User created")
Category.create( Category.buildRootCategory(user) ).right.map {
Logger.info("Root category created")
Category.create( Category.buildInboxCategory(user) ).right.map {
Logger.info("Inbox category created")
Category.create( Category.buildPeopleCategory(user) ).right.map {
Logger.info("People category created")
Category.create( Category.buildTrashCategory(user) ).right.map {
Logger.info("Trash category created")
Logger.info("All categories successfully created created")
Right(user)
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.无论如何,我真的不喜欢它所需的缩进.此外我想将Error转换为描述问题的新String(我想我应该使用fold?)
我正在寻找像这样写的东西:
val result : Either[String,CallResult] = call1.something("error 1 description")
.call2.something("error 2 description")
.call3.something("error 3 description")
.call4.something("error 4 description")
Run Code Online (Sandbox Code Playgroud)
是不是可以用Scala做这样的事情?也许同时使用Either和Option?
一个限制也是如果第一次调用失败,则不应该进行其他调用.我不想要一个解决方案,我称之为一切,然后加入eithers.
谢谢!
继Coursera上的Scala课程后,Martin Odersky展示了一个示例代码:
1 to 5 map ( i => i*i )
Run Code Online (Sandbox Code Playgroud)
并且他说Range变换为a Vector因为它们共享相同的接口(IndexedSeq)并且结果不能表示为a Range
(在它的示例中更清楚,因为他生成了一对不能表示为a的对Range).
我不确定理解,因为我认为他之前说过,在for表达式中,第一个生成器将决定将要生成的元素的种类,并且它似乎并不总是如此,至少对于Range.
而且我不确定为什么输出是Vector,因为Vector可能不是唯一可以表示上面计算结果的其他实现.
有人可以帮我理解这部分吗?
我不太了解这个领域.
有人可以解释Scala 2.10中使用宏的可能性,与使用编译预处理器的Java以及CGLIB,ASM,Byteman等工具相比可以解释什么?