小编Syn*_*sso的帖子

如何将类型约束到另一个的子集?

我觉得这是一个愚蠢的问题,但是这里...我可以定义一个类型是另一个类型的元素的子集吗?这是一个简化的例子.

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可证明总是均匀?

types scala

2
推荐指数
1
解决办法
164
查看次数

在Option.getOrElse上断言@tailrec

在下面,该行maybeNext.map{rec}.getOrElse(n)使用Optionmonad来实现递归或转义模式.

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)

scala tail-recursion

2
推荐指数
1
解决办法
690
查看次数

`equals(Any?): Boolean` 的扩展函数覆盖

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 行为吗?

kotlin

2
推荐指数
1
解决办法
1174
查看次数

使用TransactionManager使用Spring JmsTemplate编写消息

使用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)

java spring oracle-aq spring-jms

1
推荐指数
1
解决办法
1万
查看次数

折叠/减少w /可能为空Seq且没有零值

例如,在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)

这是我能解决这个问题的最好方法吗?

scala

1
推荐指数
1
解决办法
525
查看次数

在Rust函数调用上键入提示

我正在尝试从结构中提取函数.原(工作)是:

pub fn f(&self, id: Id) -> &[Foo] {
    self.foos.get(&id).map_or(&[], |foos| &**foos)
}
Run Code Online (Sandbox Code Playgroud)

哪里self.foosHashMap<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

rust

1
推荐指数
1
解决办法
183
查看次数

具有HashMap查找的迭代器映射.没有任何密钥失败

我有一个String以冒号分隔的值.每个子字符串应该是地图中的键.我想写转换函数StringVec图的值,或失败,如果任意键不存在.

到目前为止,我的尝试还不完整,但我只是迈出了一小步.第一步是将字符串转换为可选u32s 的向量.(这可能不是最好的方法):

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>,对吧?

在我完成之后,我如何包装OkErr依赖于任何Nones 的存在?

iterator hashmap rust

1
推荐指数
1
解决办法
138
查看次数

在测试函数上声明生命周期

我正在进行一项无法编译的测试:

#[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)

lifetime rust

1
推荐指数
1
解决办法
120
查看次数

在应用启动之前,将文件放在模拟器外部存储中

使用模拟器,连接外部存储器,我想模拟应用程序启动时发生的情况,并且某些文件已存在于ext存储器的相关目录中.

在AVD中启用后,外部存储器是否实际位于我的机器上?或者我应该使用一些临时的,丢弃的代码创建文件?或者我应该只在真实设备上测试?

这种情况的最佳做法是什么?

android android-emulator

0
推荐指数
1
解决办法
4839
查看次数