我刚刚发明了一个愚蠢的小助手功能:
def has_one(seq, predicate=bool):
"""Return whether there is exactly one item in `seq` that matches
`predicate`, with a minimum of evaluation (short-circuit).
"""
iterator = (item for item in seq if predicate(item))
try:
iterator.next()
except StopIteration: # No items match predicate.
return False
try:
iterator.next()
except StopIteration: # Exactly one item matches predicate.
return True
return False # More than one item matches the predicate.
Run Code Online (Sandbox Code Playgroud)
因为我能想到的最可读/惯用的内联事物是:
[predicate(item) for item in seq].count(True) == 1
Run Code Online (Sandbox Code Playgroud)
...在我的情况下这很好,因为我知道seq很小,但它只是感觉很奇怪.有没有我在这里忘记的成语,这使我不得不打破这个助手?
回顾它,这是一个令人讨厌的问题,虽然我们得到了一些很好的答案!我正在寻找:
在阅读一些Java源代码时,我遇到了这一行:
((Closeable) some_obj).close();
Run Code Online (Sandbox Code Playgroud)
some_obj显然是实现Closeable接口的类的实例.我的问题是,为什么他们在调用close()之前首先将some_obj强制转换为Closeable.我不能这样做
some_obj.close();
Run Code Online (Sandbox Code Playgroud) 我正在写一个方法,如果某些事情是真的,它将返回.但是,如果测试条件所需的资源不可用,则无法返回true或false.
早些时候,我只是把它作为一个返回a的方法boolean.但是现在,为了适应异常,我想在函数参数中传递true或false并使用返回值作为测试的成功或失败指示符.
这是在Java中执行此操作的"正确和常见"方式吗?或者是Java中普遍存在的其他东西来实现这一目标?
我正在研究一些Clojure代码,它将引用一个map并在地图中增加一个键值对.我想我正在使用ref,但我不确定原子.我需要使用交换!更加惯用?我是STM和Clojure的新手,这看起来是线程安全/理智吗?我错过了什么?
(defn increment-key [ref key]
(dosync
(if (= (get @ref key) nil)
(alter ref assoc key (atom 1))
(alter ref assoc key (atom (inc @(get @ref key)))))))
(defn -main [& args]
(def my-map (ref {}))
(increment-key my-map "yellow")
(println my-map)
(increment-key my-map "yellow")
(println my-map))
Run Code Online (Sandbox Code Playgroud)
打印
$ lein run
#<Ref@494eaec9: {yellow #<Atom@191410e5: 1>}>
#<Ref@494eaec9: {yellow #<Atom@7461373f: 2>}>
Run Code Online (Sandbox Code Playgroud) 是否有更惯用的方式如何在记录上进行模式匹配?我的代码似乎不对.
type Period = AM | PM
type TimeOfDay = {hours : int; minutes : int; p : Period}
let before (tod1 : TimeOfDay, tod2 : TimeOfDay) =
match tod1, tod2 with
| {hours = h1; minutes = m1; p = AM}, {hours = h2; minutes = m2; p = AM} -> (h1, m1) < (h2, m2)
| {hours = h1; minutes = m1; p = PM}, {hours = h2; minutes = m2; p = PM} -> (h1, m1) < …Run Code Online (Sandbox Code Playgroud) 我是一个旨在跨平台的程序; 因此,它将支持某些操作的多个实现.我的第一个想法是编写一个类的层次结构,具有一个通用接口,可能是每个平台的抽象工厂.
class Operation {
DoOperation() = 0;
}
class OperationPlatform1 : public Operation {
DoOperation();
}
class OperationPlatform2 : public Operation {
DoOperation();
}
#ifdef USING_PLATFORM1
Operation *op = new OperationPlatform1;
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我意识到将在编译时使用将要使用的实现.我试着想一想如何使用静态多态实现这一点,之后我意识到我也可以按照这些方式写一些东西:
class OperationPlatform1 {
DoOperation();
}
class OperationPlatform2 {
DoOperation();
}
#ifdef USING_PLATFORM1
typedef OperationPlatform1 Operation;
#endif
Operation op;
Run Code Online (Sandbox Code Playgroud)
抽象多个实现的好方法是什么,其中只有一个在编译时被选中?我也对性能感兴趣,所以除非必须,否则我不想使用虚拟方法.
我想循环等待,实现这一目标的最佳方法是什么?
这是我的实际代码:
var groups = ['461', '6726', '3284', '4', '121', '11', '399', '1735', '17', '19', '1614 ];
groups.forEach(function (value) {
myfunction(value);
});
Run Code Online (Sandbox Code Playgroud)
我希望 myfunction() 每 5 分钟被调用一次。
我想循环遍历组数组一次并在每个项目之间等待直到读取结束
什么是最好的方法 ?
假设您有这样的函数:
func getSomething(error: NSErrorPointer) -> Something
Run Code Online (Sandbox Code Playgroud)
你通常这样使用它:
var error : NSError? = nil
let a = getSomething(&error)
Run Code Online (Sandbox Code Playgroud)
在这里检查错误的惯用方法是什么?更具体的问题:
error == nil我们可以假设a永远不会为零,反之亦然?error为了它的无效)或a(确认它不是零)?a != nil && error != nil在某些情况下可以是真的吗?谢谢!
是否可以Vec<&dyn Trait>从实现的值的迭代器中收集 a Trait?
trait Animal {
fn make_sound(&self) -> String;
}
struct Dog;
impl Animal for Dog {
fn make_sound(&self) -> String {
"woof".to_string()
}
}
fn main() {
let dogs = [Dog, Dog];
let v: Vec<&dyn Animal> = dogs.iter().collect();
for animal in v.iter() {
println!("{}", animal.make_sound());
}
}
Run Code Online (Sandbox Code Playgroud)
这与error[E0277]: a value of type "Vec<&dyn Animal>" cannot be built from an iterator over elements of type &Dog`失败
但是,如果您使用将狗单独推入 vec(如原始问题的答案中),则它可以正常工作。
let …Run Code Online (Sandbox Code Playgroud)