标签: idioms

在不运行函数的情况下检查 Clojure 前提条件?

我有一个函数可以完成一些(可能很长)工作(defn workwork [x] ...),还有一些其他函数可以提前检查调用是否会成功(defn workwork-precondition-1 [x] ...)

workwork每次调用时都应评估前置条件函数(例如使用:pre)。前置条件函数也应该在单个函数中收集(和:ed)并直接供客户端代码使用(例如禁用按钮)。

在 Clojure 中解决此问题同时避免代码重复的惯用方法是什么?

特别是,有没有办法在不运行函数体的情况下评估函数的前提条件?

idioms clojure preconditions

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

获得与前一个不同的随机数的惯用方法?

Rust 有没有更好的方法来做到这一点?

let mut current_index = rng.gen_range(0, 5);
while current_index == previous_index {
    current_index = rng.gen_range(0, 5);
}
Run Code Online (Sandbox Code Playgroud)

random idioms rust

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

如果 a.) 密钥不存在或 b.) 密钥未经过验证,则以最惯用的方式安全地从 dict() 中弹出密钥

所以,我想知道。我遇到以下问题,即在对弹出的值执行某些操作之前,字典弹出需要进行多次检查和平衡。

\n\n

我知道:

\n\n
    \n
  1. 如果字典中存在键,则从dict.pop()字典中删除具有给定键的元素并返回其值。

  2. \n
  3. 如果给定的键在字典中不存在\xe2\x80\x99t,则返回给定的默认值。

  4. \n
  5. 如果给定的键在字典中不存在\xe2\x80\x99并且没有默认值传递给pop(),那么它将抛出KeyError。

  6. \n
\n\n

所以,我觉得3.我需要首先处理KeyError异常。如果是,则从字典中弹出该键。

\n\n

然后,2如果返回默认值,则不执行任何操作。

\n\n

然后,如果为 1,则执行一些验证,因为该值需要匹配预定义的字符串格式(电子邮件的正则表达式匹配,使用 Django 的内置from django.core.validators import email_re,如果细节很重要)。

\n\n

我们有以下内容:

\n\n
\ndef some_function():\n        try:\n            email = account.pop(\'email\', None)\n        except KeyError as ex:\n            return\n\n        if not email:\n            return\n\n        if not email_re.match(email):\n            return\n\n        # Get/Update Or Create SurfAccount:\n        surf_account, created = SurfAccount.objects.update_or_create(\n            email=email,\n            defaults=account\n        )\n\n        return surf_account, surfer\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我不确定这是与 KeyError 异常处理程序结合执行验证的最惯用的方法...因为如果我们这样调用函数,我们可能会遇到 TypeError:

\n\n
surf_account, surfer = some_function()\n
Run Code Online (Sandbox Code Playgroud)\n\n

returning因为当验证失败时我们就“退出”了...... …

python dictionary idioms

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

如何使 std::variants 的使用在语法上更加“可口”?

这是受到我给新手用户的回答的启发,我建议他们使用 anstd::variant而不是 union。

通过工会,您可能会遇到如下情况:

struct Box {
    struct Item { float value; };
    using Boxes = std::vector<Box>;

    union Value {
        Item item;
        Boxes boxes;
    };

    Value contents;
    std::string label;
};
Run Code Online (Sandbox Code Playgroud)

(不完全是最初的问题,我在这里接受了一些诗意的许可。)并且使用一个变体,该类可能如下所示:

struct Box {
    struct Item { float value; };
    using Boxes = std::vector<Box>;

    std::variant<Item, Boxes> contents;
    std::string label;
};
Run Code Online (Sandbox Code Playgroud)

问题是,使用第一个变体,我可以写

if (box.contents.boxes.size() > 2) { foo(); }
Run Code Online (Sandbox Code Playgroud)

如果我已经确定会有子框,这就会起作用。

对于std::variant,我必须写:

if (std::get<Boxes>(box.contents).size() > 2) { foo(); }
Run Code Online (Sandbox Code Playgroud)

我觉得第二个版本的可读性要差得多,有点混乱,而且很分散注意力。另外 - 我必须知道 的类型boxes

在我的代码中,我可以做些什么来让我的用户无需进行此类std::get()调用,并使他们的生活更加愉快?

c++ idioms syntactic-sugar c++17 std-variant

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

Julia 根据条件将向量分割为子向量的惯用方法

假设我有一个向量a = [1, 0, 1, 2, 3, 4, 5, 0, 5, 6, 7, 8, 0, 9, 0],我想根据该数组中的值的条件将其分割为更小的向量。例如值为零。\n因此我想获得以下向量的向量

\n
 [1, 0]\n [1, 2, 3, 4, 5, 0]\n [5, 6, 7, 8, 0]\n [9, 0]\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止,这对我来说是一个幼稚的解决方案,但它失去了类型。

\n
function split_by_\xce\xbb(a::Vector, \xce\xbb)\n    b = []\n    temp = []\n    for i in a\n        push!(temp, i)\n        if \xce\xbb(i)\n            push!(b, temp)\n            temp = []\n        end\n    end\n    b\nend\nsplit_by_\xce\xbb(a, isequal(0))\n
Run Code Online (Sandbox Code Playgroud)\n

然后我尝试使用范围,感觉更惯用一点,并且不会丢失类型。

\n
function split_by_\xce\xbb(a::Vector, \xce\xbb)\n    idx = findall(\xce\xbb, a)\n    ranges = [(:)(i==1 ? 1 : …
Run Code Online (Sandbox Code Playgroud)

idioms julia

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

ruby 在多个数组上映射一个函数

我有 2 个数组

   asc = [0, 1, 2, 3, 4, 5]
   dsc = [5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

我想要一个新数组,它是将 asc 和 dsc 中的每个相应项相乘的结果

我已经习惯了 Clojure map

(map #(* %1 %2) asc dsc) ;=> (0 4 6 6 4 0)
Run Code Online (Sandbox Code Playgroud)

它们在 Ruby 中是否等效,在 Ruby 中执行此操作的惯用方法是什么?

我是 Ruby 的新手,但它似乎有非常好的简洁解决方案,所以我想我错过了一些东西。

我只是写:

i = 0
res = []

while i < asc.length() do
  res.append(asc[i] * dsc[i])
end
Run Code Online (Sandbox Code Playgroud)

ruby arrays iteration loops idioms

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

Golang 替代带有默认参数的 C++ 函数:多个函数或结构参数

我想知道 Go 中的最佳实践相当于使用默认参数绑定的 C++ 函数,这对于用户来说可能是最容易看到函数参数的(在 linter 帮助下)。
您认为最 GO 风格、最简单的测试功能使用方式是什么?

C++ 中的示例函数:

void test(int x, int y=0, color=Color());
Run Code Online (Sandbox Code Playgroud)

Go 中的等价

1. 多重签名:

func test(x int)
func testWithY(x int, y int)
func testWithColor(x int, color Color)
func testWithYColor(x int, y int, color Color)
Run Code Online (Sandbox Code Playgroud)

亲:

  • linter 将显示测试的所有可能性
  • 编译器会选择最短路径

缺点:

  • 当参数很多时可能会不知所措

2. 带结构体参数:

type testOptions struct {
    X      int
    Y      int
    color  Color
}

func test(opt *testOptions)

// user 
test(&testOptions{x: 5})
Run Code Online (Sandbox Code Playgroud)

亲:

  • 只有一个签名
  • 只能指定一些值

缺点:

  • 需要定义一个结构体
  • 这些值将由系统默认设置

在模块github.com/cresty/defaults的帮助下,有一种方法可以设置默认值(但需要在运行时调用 Reflect 的成本)。

type …
Run Code Online (Sandbox Code Playgroud)

c++ idioms go function-parameter

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

C++中的Base-from-Member Idiom

下面的代码是从这里:

#include <streambuf>  // for std::streambuf
#include <ostream>    // for std::ostream

class fdoutbuf
    : public std::streambuf
{
public:
    explicit fdoutbuf( int fd );
    //...
};

class fdostream
    : public std::ostream
{
protected:
    fdoutbuf buf;
public:
    explicit fdostream( int fd ) 
        : buf( fd ), std::ostream( &buf ) // This is not allowed. 
                                          // buf can't be initialized before std::ostream.
        {}
    //...
};
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个评论.为什么"在std :: ostream之前无法初始化buf"?我可以用一些帮助来理解这个吗?

c++ idioms ostream initialization-list

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

C++指向非静态方法的有用性

正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处.例如,拥有一个具有三种方法的对象

 class Provider
 {
 public:
 int A(int in);
 int B(int in);
 int C(int in);
 }
Run Code Online (Sandbox Code Playgroud)

和需要指向提供者方法指针的消费者(无论是A,B还是C).有一个控制器向所谓的消费者提供指向3种方法之一的指针,我们可以在使用Provider实例的消费者代码中编写一些东西,并指向A,B或C,这取决于控制器发送的内容.

如果这是C++中非静态方法的指针所能做到的,是否还有一种方法可以为对象的方法提供更"智能"的指针,而无需将对象与该方法指针一起发送给消费者?在肯定的情况下,所谓的成语/机制是什么(甚至一种模拟这种方式的资格作为我感兴趣的答案).

c++ design-patterns idioms

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

是否有更惯用的方式来表达循环中剩余的迭代次数?

我正在编写一个像这样的Ruby循环:

iterations = 10

until iterations == 0
    unless iterations == 1
      puts "#{iterations} iterations until done"
    else
      puts "#{iterations} iteration until done"
    end

    iterations -= 1
end

puts "Done"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更多"Ruby方式"来优化/编写此代码.有人有什么想法吗?

ruby iteration loops idioms

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