前几天我注意到了这个有趣的语法,用于指定Scala类的类型参数.
scala> class X[T, U]
defined class X
scala> new (Int X Int)
res1: X[Int,Int] = X@856447
Run Code Online (Sandbox Code Playgroud)
这种语法有名称吗?它的用例是什么?
我已经开始使用Python开发商业应用程序了,我正在权衡如何分发应用程序的选项.
除了显而易见的(分发具有适当商业许可证的来源)之外,我正在考虑仅分发.pyc没有相应.py来源的文件.但是我不太熟悉Python的兼容性保证,知道这是否可行,更不用说它是否是一个好主意.
.pyc文件是否独立于底层操作系统?例如,.pyc在64位Linux机器上生成的文件是否可以在32位Windows机器上运行?
我发现该.pyc文件应该与bugfix版本兼容,但主要和次要版本呢?例如,使用Python 3.1.5生成的文件是否与Python 3.2.x兼容?或者.pyc使用Python 2.7.3生成的文件是否与Python 3.x版本兼容?
编辑:
首先,我可能不得不安抚那些不愿意分发来源的利益相关者..pyc在没有来源的情况下分发可能会给他们一定程度的安慰,因为它需要额外的反编译步骤来获取来源,即使这一步有些微不足道.这足以让诚实的人保持诚实.
我最近写了以下Scala:
val f: File = ... // pretend this file came from somewhere
val foo = toFoo(io.Source.fromFile(f).mkString)
Run Code Online (Sandbox Code Playgroud)
我真的不喜欢这种流动的方式.要了解发生了什么,你必须从f中间开始,向左fromFile阅读,向右mkString阅读,再向左阅读toFoo.啊.
特别是在习惯了序列的功能转换之后,这很难理解.我的下一次尝试看起来像这样:
val foo = Some(f)
.map(io.Source.fromFile)
.map(_.mkString)
.map(toFoo)
.get
Run Code Online (Sandbox Code Playgroud)
我喜欢这个更好的流程.你可以看到会发生什么这是一个很好的使用Option课程?还是我在滥用它?有没有更好的模式可以用来实现相同的流程?
我正在向Rails 4应用程序添加结构化日志记录.使用本文中描述的lograge和logstash-logger,我得到了大部分工作.
我在向日志添加请求ID时遇到问题.我发现最接近的是将其添加到config/${ENV}.rb:
config.log_tags = [:uuid]
Run Code Online (Sandbox Code Playgroud)
但是这会将请求ID添加到标记列表,而不是将其添加为命名字段.
{
"tags": [
"da76b4be-01ae-4cc4-8d3c-87062ea02cfe"
],
"host": "services",
"severity": "DEBUG",
"@version": "1",
"@timestamp": "2016-09-13T17:24:34.883+00:00",
"message": "..."
}
Run Code Online (Sandbox Code Playgroud)
这是有问题的.它使得如何搜索特定的请求ID变得更加尴尬和不那么明显.另外,在logstash中解析消息它会覆盖已经与日志消息关联的任何其他标记.
有什么办法可以将请求ID作为命名字段添加到日志中吗?
{
"request_id", "da76b4be-01ae-4cc4-8d3c-87062ea02cfe",
"host": "services",
"severity": "DEBUG",
"@version": "1",
"@timestamp": "2016-09-13T17:24:34.883+00:00",
"message": "..."
}
Run Code Online (Sandbox Code Playgroud) 我有一个.war文件,用于通常在Jetty中正常运行的应用程序.
我正在尝试将应用程序移植到WebLogic中运行,但在启动时我遇到了以下异常:
ERROR:Foo - Error in named query: findBar
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from Bar]
at org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:80)
at antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)
at org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:54)
at antlr.CharScanner.<init>(CharScanner.java:51)
at antlr.CharScanner.<init>(CharScanner.java:60)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:56)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:53)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:50)
...
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?
我正在使用Hibernate 3.3.1.GA和WebLogic 10.3.2.0.
我正在尝试将Lift应用程序集成到一些现有的Java代码中.在我的一个片段中,我有一个Java对象Array,我需要将它映射到NodeSeq.我可以获得一个节点数组,但不能获得NodeSeq.(至少,不是以非常实用的方式).
import scala.xml.NodeSeq
// pretend this is code I can't do anything about
val data = Array("one", "two", "three")
// this is the function I need to write
def foo: NodeSeq = data.map { s => <x>{s}</x> }
// ^
// error: type mismatch;
// found : Array[scala.xml.Elem]
// required: scala.xml.NodeSeq
Run Code Online (Sandbox Code Playgroud)
最干净的方法是什么?
我在一些库中看过,例如Spray,这样的双包规范:
package cc.spray
package http
// code
Run Code Online (Sandbox Code Playgroud)
这只是包装cc.spray.http的眼睛糖果,还是有一个功能上的好处,打破这两个分开?
如何def someA(in trait B)使用trait A与C#MyTypein中相同B?(然后A#MyType =:= B#MyType)
trait C {
type MyType
}
trait A {
self: C =>
def doSomething(s: MyType) { println(s.toString)}
}
trait B {
self: C =>
def someA: A
def myType: MyType
def action = someA.doSomething(myType)
}
// Mix part
case class Ahoy(value: String)
trait ConcreteC extends C {
type MyType = Ahoy
}
class PieceOfCake extends B with ConcreteC {
val someA = …Run Code Online (Sandbox Code Playgroud) 我已经意识到我传递Scala集合的典型方式可以使用一些改进.
def doSomethingCool(theFoos: List[Foo]) = { /* insert cool stuff here */ }
// if I happen to have a List
doSomethingCool(theFoos)
// but elsewhere I may have a Vector, Set, Option, ...
doSomethingCool(theFoos.toList)
Run Code Online (Sandbox Code Playgroud)
我倾向于编写我的库函数来List作为参数类型,但我确信有一些更通用的东西我可以放在那里以避免.toList我在应用程序代码中偶尔的调用.这特别令人讨厌,因为我的doSomethingCool函数通常只需要调用map,flatMap并且filter在所有集合类型上定义.
对于那种"更普遍的东西",我有哪些选择?
是否一个好的做法是制作所有可能存在未来实现的接口(特征)方法,其中无效参数返回一个选项?
让我举个例子.如果我要实现具有特征的概率分布的库
trait Similarity {
def getDensity(): Double
}
Run Code Online (Sandbox Code Playgroud)
由于大多数分布未在整个真实空间中定义,因此总是存在一些非法参数,例如高斯分布的非正方差.如果我理解正确的话,我应该回归Option[Double]而不是Double投掷IllegalArgumentException.
我认为大多数功能/计算都是如此.在这种情况下,什么是"最佳做法"?我担心这会让图书馆过于笨拙.
谢谢