我有一个函数可以完成一些(可能很长)工作(defn workwork [x] ...),还有一些其他函数可以提前检查调用是否会成功(defn workwork-precondition-1 [x] ...)。
workwork每次调用时都应评估前置条件函数(例如使用:pre)。前置条件函数也应该在单个函数中收集(和:ed)并直接供客户端代码使用(例如禁用按钮)。
在 Clojure 中解决此问题同时避免代码重复的惯用方法是什么?
特别是,有没有办法在不运行函数体的情况下评估函数的前提条件?
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) 所以,我想知道。我遇到以下问题,即在对弹出的值执行某些操作之前,字典弹出需要进行多次检查和平衡。
\n\n我知道:
\n\n如果字典中存在键,则从dict.pop()字典中删除具有给定键的元素并返回其值。
如果给定的键在字典中不存在\xe2\x80\x99t,则返回给定的默认值。
如果给定的键在字典中不存在\xe2\x80\x99并且没有默认值传递给pop(),那么它将抛出KeyError。
所以,我觉得3.我需要首先处理KeyError异常。如果是,则从字典中弹出该键。
然后,2如果返回默认值,则不执行任何操作。
\n\n然后,如果为 1,则执行一些验证,因为该值需要匹配预定义的字符串格式(电子邮件的正则表达式匹配,使用 Django 的内置from django.core.validators import email_re,如果细节很重要)。
我们有以下内容:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n但是,我不确定这是与 KeyError 异常处理程序结合执行验证的最惯用的方法...因为如果我们这样调用函数,我们可能会遇到 TypeError:
\n\nsurf_account, surfer = some_function()\nRun Code Online (Sandbox Code Playgroud)\n\nreturning因为当验证失败时我们就“退出”了...... …
这是受到我给新手用户的回答的启发,我建议他们使用 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()调用,并使他们的生活更加愉快?
假设我有一个向量a = [1, 0, 1, 2, 3, 4, 5, 0, 5, 6, 7, 8, 0, 9, 0],我想根据该数组中的值的条件将其分割为更小的向量。例如值为零。\n因此我想获得以下向量的向量
[1, 0]\n [1, 2, 3, 4, 5, 0]\n [5, 6, 7, 8, 0]\n [9, 0]\nRun Code Online (Sandbox Code Playgroud)\n到目前为止,这对我来说是一个幼稚的解决方案,但它失去了类型。
\nfunction 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))\nRun Code Online (Sandbox Code Playgroud)\n然后我尝试使用范围,感觉更惯用一点,并且不会丢失类型。
\nfunction 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) 我有 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) 我想知道 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)
亲:
缺点:
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) 下面的代码是从这里:
#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"?我可以用一些帮助来理解这个吗?
正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处.例如,拥有一个具有三种方法的对象
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++中非静态方法的指针所能做到的,是否还有一种方法可以为对象的方法提供更"智能"的指针,而无需将对象与该方法指针一起发送给消费者?在肯定的情况下,所谓的成语/机制是什么(甚至一种模拟这种方式的资格作为我感兴趣的答案).
我正在编写一个像这样的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方式"来优化/编写此代码.有人有什么想法吗?