标签: idioms

惯用Python has_one

我刚刚发明了一个愚蠢的小助手功能:

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很小,但它只是感觉很奇怪.有没有我在这里忘记的成语,这使我不得不打破这个助手?

澄清

回顾它,这是一个令人讨厌的问题,虽然我们得到了一些很好的答案!我正在寻找:

  • 一个明显的,可读的内联习语或stdlib函数,在这种情况下,急切的评估是可以接受的.
  • 一个更明显和可读的辅助函数 - …

python idioms

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

为什么首先投射到Closeable?

在阅读一些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)

java casting idioms interface

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

是否有返回true,false或unknown的Java约定?

我正在写一个方法,如果某些事情是真的,它将返回.但是,如果测试条件所需的资源不可用,则无法返回true或false.

早些时候,我只是把它作为一个返回a的方法boolean.但是现在,为了适应异常,我想在函数参数中传递true或false并使用返回值作为测试的成功或失败指示符.

这是在Java中执行此操作的"正确和常见"方式吗?或者是Java中普遍存在的其他东西来实现这一目标?

java idioms exception return-value

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

Clojure:原子和参考的习惯用法?

我正在研究一些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)

idioms clojure ref stm

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

F#中记录的模式匹配

是否有更惯用的方式如何在记录上进行模式匹配?我的代码似乎不对.

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)

f# idioms pattern-matching

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

抽象跨平台实现的常用习惯是什么?

我是一个旨在跨平台的程序; 因此,它将支持某些操作的多个实现.我的第一个想法是编写一个类的层次结构,具有一个通用接口,可能是每个平台的抽象工厂.

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)

抽象多个实现的好方法是什么,其中只有一个在编译时被选中?我也对性能感兴趣,所以除非必须,否则我不想使用虚拟方法.

c++ abstraction design-patterns idioms

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

Nodejs 在循环中等待

我想循环等待,实现这一目标的最佳方法是什么?

这是我的实际代码:

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 分钟被调用一次。

我想循环遍历组数组一次并在每个项目之间等待直到读取结束

什么是最好的方法 ?

idioms wait node.js

3
推荐指数
2
解决办法
6577
查看次数

Swift惯用错误检查

假设您有这样的函数:

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)

在这里检查错误的惯用方法是什么?更具体的问题:

  1. 如果error == nil我们可以假设a永远不会为零,反之亦然?
  2. 我们应该先检查一下:( error为了它的无效)或a(确认它不是零)?
  3. a != nil && error != nil在某些情况下可以是真的吗?

谢谢!

error-handling idioms nserror swift

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

多个 CMake 目标的 target_compile_definitions?

有人 告诉我,CFLAGS直接在 CMake 中进行设置是不好的做法,相反,我应该使用该target_compile_definitions()命令。

好的,但是 - 如果我想对多个(独立)目标使用相似/相同的定义怎么办?我不想一遍又一遍地重复自己。

idioms dry cmake compiler-options

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

将借用值的向量收集到借用特征的 vec 中

是否可以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)

polymorphism idioms rust

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