我正在使用 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但这是这些特征的惯用用法吗?或者如果我只使用常规方法会更好吗?
在 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 模块。
我目前的代码具有与以下类似的机制
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) 我们需要在工作场所定期解决的问题是如何根据用户提供的表/列名称构建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)
我并不特别被这些实现中的任何一个所吸引.
我很有兴趣听到其他解决这个问题的方法的想法,着眼于使代码更容易阅读/理解/维护.
有哪些替代技术?
这有点困扰我一段时间了.在学习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)
上述两种形式中的任何一种都有什么特别的优点/缺点吗?或者是否有更优雅的方式?
我在我工作的代码库中看到了很多这样的习惯用法,基本上是:
接口 - >定义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.
我发现<<除非已经初始化,否则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]
我有一个列表,其中包含其他列表,我想检索具有最少元素的列表.一个明显的解决方案是
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)
有没有比较惯用的方法呢?
在JavaScript中,可以检查myObject.key是否存在值(未定义)和真实.
if (myObject.key) ...
Run Code Online (Sandbox Code Playgroud)
是否有PHP等价物?或者我是否必须继续编写代码isset(my_array['key']) && my_array['key']以实现所需的结果?我觉得它违反DRY并且看起来很难看.
我是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步.实施一种方法来计算孩子爬楼梯的可能方式."