标签: idioms

使用 From/Into 特征进行错误的转换是否符合习惯?

我正在使用 jwt 为我的 API 开发身份验证系统,并且有以下两种类型:

#[derive(Serialize, Deserialize)]
pub struct UserClaims {
    email: String,
    exp: usize,
    sub: String,
}

#[derive(Serialize)]
struct AccessToken(String);
Run Code Online (Sandbox Code Playgroud)

现在我想表达这样一个事实:访问令牌可以“转换”为声明对象。所以我决定实施以下措施:

impl From<AccessToken> for UserClaims {
    fn from(token: AccessToken) -> Self {
        // ... NOTE: this is fallible i.e actually returns a `Result`
    }
}
Run Code Online (Sandbox Code Playgroud)

但我意识到解码令牌的代码是错误的并返回 a Result,现在我可以将impl块更改为类似以下内容:impl Into<Result<UserClaims, SomeError>> for AccessToken但这是这些特征的惯用用法吗?或者如果我只使用常规方法会更好吗?

idioms rust

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

这是在 Perl 中定义部分函数的惯用方法吗?

在 Perl 中定义部分函数的最常见/惯用方法是什么,即未在所有输入上定义的函数。例如,在 Haskell 中我们有

safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:xs) = Just x
Run Code Online (Sandbox Code Playgroud)

在C中我们有

int factorial(int n) {
     assert(n >= 0);
     int result = 1;
     while (n) result *= n--;
     return result;
}
Run Code Online (Sandbox Code Playgroud)

或者

int factorial(int n) {
     if (n < 0) return -1;
     int result = 1;
     while (n) result *= n--;
     return result;
}
Run Code Online (Sandbox Code Playgroud)

我宁愿不导入 CPAN 模块。

perl idioms

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

Kotlin stlib 中是否有函数用于将 List&lt;Pair&lt;A, B&gt;&gt; 转换为 Pair&lt;List&lt;A&gt;, List&lt;B&gt;&gt;

我目前的代码具有与以下类似的机制

fun main() {
    val listOfLists = listOf(listOf("1234", "1", "42"), listOf("hello", "there"))
    
    val (lengths: List<List<Int>>, resultingListsOfLists: List<List<String>?>) =
        listOfLists
            .map {
                val lengths = it.map { it.count() }
                Pair(
                    lengths,
                    if (lengths.sum() > 5) {
                        // doing some transformation here in my original code,
                        // but for the sake of keeping it simple, just return `it`
                        it 
                    } else {
                        null
                    }
                )
            }
            .let { mapped ->
                println(mapped)
                Pair(mapped.map { it.first }, mapped.map { it.second })
            }
            
    println(lengths)
    println(resultingListsOfLists) …
Run Code Online (Sandbox Code Playgroud)

idioms transformation kotlin

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

使用列名向量,生成一个sql语句

我们需要在工作场所定期解决的问题是如何根据用户提供的表/列名称构建sql语句.我想解决的问题是列名之间的逗号.

一种技术看起来像这样.

selectSql  = "SELECT ";

for (z = 0; z < columns.size(); z++)
{
    selectSql += columns[z]._name;
    selectSql += ", "; 
}

selectSql = selectSql(0, selectSql.len() - 2);

selectSql += "FROM some-table";
Run Code Online (Sandbox Code Playgroud)

另一种技术看起来像这样

selectSql  = "SELECT ";

for (z = 0; z < columns.size(); z++)
{
    selectSql += columns[z]._name;
    if (z < columns.size() - 1) 
        selectSql += ", "; 
}

selectSql += "FROM some-table";
Run Code Online (Sandbox Code Playgroud)

我并不特别被这些实现中的任何一个所吸引.

我很有兴趣听到其他解决这个问题的方法的想法,着眼于使代码更容易阅读/理解/维护.

有哪些替代技术?

c++ sql idioms

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

大多数pythonic形式用于映射一系列语句?

这有点困扰我一段时间了.在学习Python之前我学习了Haskell,所以我一直喜欢将许多计算作为映射到列表中.这是由列表理解精美表达的(我在这里给出了pythonic版本):

result = [ f(x) for x in list ]
Run Code Online (Sandbox Code Playgroud)

但在许多情况下,我们希望在x上执行多个语句,例如:

result = [ f(g(h(x))) for x in list ]
Run Code Online (Sandbox Code Playgroud)

这很快变得笨重,难以阅读.

我的正常解决方案是将其扩展回for循环:

result = []
for x in list:
  x0 = h(x)
  x1 = g(x0)
  x2 = f(x1)
  result.append(x2)
Run Code Online (Sandbox Code Playgroud)

关于这一点困扰我的一件事就是不得不初始化空列表'结果'.这是一个微不足道的事情,但它让我感到不快.我想知道是否有任何替代等效形式.一种方法可能是使用本地函数(这是他们在Python中调用的吗?)

def operation(x):
  x0 = h(x)
  x1 = g(x0)
  x2 = f(x1)
  return x2
result = [ operation(x) for x in list ]
Run Code Online (Sandbox Code Playgroud)

上述两种形式中的任何一种都有什么特别的优点/缺点吗?或者是否有更优雅的方式?

python coding-style idioms

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

这种模式/习语是什么?有什么好处?

我在我工作的代码库中看到了很多这样的习惯用法,基本上是:

接口 - >定义getter/setter的抽象类 - >实现

例如:

interface Foo{
    void doSomethingA();
    void doSomethingB();
}

abstract class AbstractFoo implements Foo{
    protected int x;
    protected String y;
    int getX(){ return x;}
    void setX(int x){ this.x = x;}
    String getY(){ return y;}
    void setY(String y){ this.y = y;}
}
//One or more concrete classes extending AbstractFoo
Run Code Online (Sandbox Code Playgroud)

这有名字吗?我能看到的唯一好处是扩展AbstractFoo的类不需要重新实现它们的getter和setter.

java design-patterns idioms

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

什么是将元素附加到可能尚未初始化的数组的Ruby习惯用法?

我发现<<除非已经初始化,否则Array不能使用它.我目前这样写:

unless @app
 @app = my_array
else
 @app << my_array
end 
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来写这个?

我之前使用过|| =,但是

(@app ||= []) << [1,2,3]
Run Code Online (Sandbox Code Playgroud)

将返回[[1,2,3]],这不是我们想要的.我们想要[1,2,3]

ruby arrays idioms append

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

Python:获取较小尺寸列表的惯用方法

我有一个列表,其中包含其他列表,我想检索具有最少元素的列表.一个明显的解决方案是

list_of_list = ...
least = list_of_lists[0]
for list in list_of_lists[1:]
  if len(list) < len(least):
    least = list
return least
Run Code Online (Sandbox Code Playgroud)

有没有比较惯用的方法呢?

python idioms list

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

检查数组键是否存在且在同一命令中是否真实?

在JavaScript中,可以检查myObject.key是否存在值(未定义)真实.

if (myObject.key) ...
Run Code Online (Sandbox Code Playgroud)

是否有PHP等价物?或者我是否必须继续编写代码isset(my_array['key']) && my_array['key']以实现所需的结果?我觉得它违反DRY并且看起来很难看.

php idioms web

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

与Rust相关的惯用语匹配

我是Rust的新手,但作为Haskell的粉丝,我非常感谢matchRust的工作方式.现在我面临着一个罕见的情况,我确实需要堕落 - 从某种意义上说,我希望所有匹配的几个重叠的案例都能被执行.这有效:

fn options(stairs: i32) -> i32 {
    if stairs == 0 {
        return 1;
    }
    let mut count: i32 = 0;
    if stairs >= 1 {
        count += options(stairs - 1);
    }
    if stairs >= 2 {
        count += options(stairs - 2);
    }
    if stairs >= 3 {
        count += options(stairs - 3);
    }
    count
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是否是Rust中的惯用语或是否有更好的方法.

编辑:上下文是Cracking the Coding Interview的一个问题:"一个孩子正在爬楼梯,有n个步骤,可以一步跳1步,2步或3步.实施一种方法来计算孩子爬楼梯的可能方式."

idioms fibonacci fall-through rust

0
推荐指数
2
解决办法
2217
查看次数