我觉得这是一个愚蠢的问题,但是这里...我可以定义一个类型是另一个类型的元素的子集吗?这是一个简化的例子.
scala> class Even(i: Int) {
| assert(i % 2 == 0)
| }
defined class Even
scala> new Even(3)
java.lang.AssertionError: assertion failed
Run Code Online (Sandbox Code Playgroud)
这是运行时检查.我可以定义一个类型,以便在编译时检查它吗?IE,输入参数i
可证明总是均匀?
在下面,该行maybeNext.map{rec}.getOrElse(n)
使用Option
monad来实现递归或转义模式.
scala> @tailrec
| def rec(n: Int): Int = {
| val maybeNext = if (n >= 99) None else Some(n+1)
| maybeNext.map{rec}.getOrElse(n)
| }
Run Code Online (Sandbox Code Playgroud)
看起来不错,但是:
<console>:7: error: could not optimize @tailrec annotated method:
it contains a recursive call not in tail position
def rec(n: Int): Int = {
^
Run Code Online (Sandbox Code Playgroud)
我觉得编译器应该能够在这种情况下整理尾递归.它相当于以下(有点令人厌恶,但可编译)的样本:
scala> @tailrec
| def rec(n: Int): Int = {
| val maybeNext = if (n >= 99) None else Some(n+1)
| if (maybeNext.isEmpty) n
| …
Run Code Online (Sandbox Code Playgroud) Java 依赖项定义了一些没有 equals 方法的值类。他们真的应该实施它,但他们没有。
public class OrderBookEntry {
private String price;
private String qty;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getQty() {
return qty;
}
public void setQty(String qty) {
this.qty = qty;
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过扩展实现equals
fun OrderBookEntry.equals(other: Any?): Boolean =
EqualsBuilder.reflectionEquals(this, other)
Run Code Online (Sandbox Code Playgroud)
但我得到了一个警告
分机由成员遮蔽。
public open fun equals(other: Any?): Boolean
并且扩展方法没有效果。
我可以覆盖 equals 行为吗?
使用Spring-JMS,可以通过DefaultMessageListenerContainer在外部事务上下文中接收消息.
但是,编写消息的唯一记录方式是通过JmsTemplate.send(…)
,我无法看到如何强制使用给定的消息TransactionManager
.
谁能指出我正确的方向?
更多信息:确保事务管理器可用(WebSphereUowTransactionManager
),使用JmsTemplate.write
针对Oracle的AQjmsFactory.getQueueConnectionFactory(dataSource)
结果:
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is oracle.jms.AQjmsException: could not use local transaction commit in a global transaction
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:534)
Caused by: oracle.jms.AQjmsException: could not use local transaction commit in a global transaction
at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:1053)
at oracle.jms.AQjmsSession.commit(AQjmsSession.java:1021)
at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:573)
at org.springframework.jms.core.JmsTemplate$3.doInJms(JmsTemplate.java:536)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:466)
... 24 more
Caused by: java.sql.SQLException: could not …
Run Code Online (Sandbox Code Playgroud) 例如,在Slick中,DDL
可以组成对象:
val t1: DDL = Table1.ddl
val t2: DDL = Table2.ddl
val compositeDDL = t1 ++ t2
Run Code Online (Sandbox Code Playgroud)
如果我有一个序列DDL
的I想将它们减少到一个单一的DDL
与++
:
ddls.reduceLeft(_ ++ _)
Run Code Online (Sandbox Code Playgroud)
如果序列为空,则不起作用.但我也不能使用折叠,因为我可以使用没有零起始值(这样的值是否有意义?).
ddls.foldLeft( wot? )(_ ++ _)
Run Code Online (Sandbox Code Playgroud)
所以我诉诸于:
if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))
Run Code Online (Sandbox Code Playgroud)
这是我能解决这个问题的最好方法吗?
我正在尝试从结构中提取函数.原(工作)是:
pub fn f(&self, id: Id) -> &[Foo] {
self.foos.get(&id).map_or(&[], |foos| &**foos)
}
Run Code Online (Sandbox Code Playgroud)
哪里self.foos
是HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>
提取后我有
fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
&foos.get(&id).map_or(&[], |xs| &**xs);
}
Run Code Online (Sandbox Code Playgroud)
产生的错误是
error: mismatched types:
expected `&[_; 0]`,
found `&[foo::Foo]`
(expected array of 0 elements,
found slice) [E0308]
Run Code Online (Sandbox Code Playgroud)
我想我需要提供一个类型提示.这是正确的吗?如果是这样,我如何显式声明U
调用时的类型Option.map_or<U, F>(self, default: U, f: F) -> U
我有一个String
以冒号分隔的值.每个子字符串应该是地图中的键.我想写转换函数String
成Vec
图的值,或失败,如果任意键不存在.
到目前为止,我的尝试还不完整,但我只是迈出了一小步.第一步是将字符串转换为可选u32
s 的向量.(这可能不是最好的方法):
fn parse(string: &String, lookup: HashMap<String, u32, FastHasher>) -> Vec<Option<u32>> {
string.split(":").map(|s: &str| lookup.get(s)).collect()
}
Run Code Online (Sandbox Code Playgroud)
这导致了
error: the trait bound `std::vec::Vec<std::option::Option<u32>>: std::iter::FromIterator<std::option::Option<&u32>>` is not satisfied [--explain E0277]
--> <anon>:8:52
|>
8 |> string.split(":").map(|s: &str| lookup.get(s)).collect()
|> ^^^^^^^
note: a collection of type `std::vec::Vec<std::option::Option<u32>>` cannot be built from an iterator over elements of type `std::option::Option<&u32>`
Run Code Online (Sandbox Code Playgroud)
我相信这意味着我需要导入或编写自己的from-iterator行为Option<&u32>
,对吧?
在我完成之后,我如何包装Ok
或Err
依赖于任何None
s 的存在?
我正在进行一项无法编译的测试:
#[test]
fn node_cost_dequeue() {
let mut queue: BinaryHeap<&NodeCost> = BinaryHeap::new();
let cost_1: NodeCost = NodeCost::new(1, 50, 0);
let cost_2: NodeCost = NodeCost::new(2, 30, 0);
let cost_3: NodeCost = NodeCost::new(3, 80, 0);
queue.push(&cost_1);
queue.push(&cost_2);
queue.push(&cost_3);
assert_eq!(2, (*queue.pop().unwrap()).id);
}
Run Code Online (Sandbox Code Playgroud)
结果是 error: cost_1 does not live long enough
附加信息"借款人的借款价值下降".
所以我尝试添加显式的生命周期注释.
#[test]
fn node_cost_dequeue() {
let mut queue: BinaryHeap<&'a NodeCost> = BinaryHeap::new();
let cost_1: NodeCost<'a> = NodeCost::new(1, 50, 0);
let cost_2: NodeCost<'a> = NodeCost::new(2, 30, 0);
let cost_3: NodeCost<'a> = NodeCost::new(3, 80, 0); …
Run Code Online (Sandbox Code Playgroud) 使用模拟器,连接外部存储器,我想模拟应用程序启动时发生的情况,并且某些文件已存在于ext存储器的相关目录中.
在AVD中启用后,外部存储器是否实际位于我的机器上?或者我应该使用一些临时的,丢弃的代码创建文件?或者我应该只在真实设备上测试?
这种情况的最佳做法是什么?