我今天开始阅读关于underscore.js的文章,它是一个javascript库,它添加了一些我习惯在Python中使用的函数式编程好东西.一个非常酷的速记方法是采摘.
确实在Python中我经常需要挖掘一些特定的属性,并最终做到这一点:
users = [{
"name" : "Bemmu",
"uid" : "297200003"
},
{
"name" : "Zuck",
"uid" : "4"
}]
uids = map(lambda x:x["uid"], users)
Run Code Online (Sandbox Code Playgroud)
如果下划线速记在Python中的某处,那么这是可能的:
uids = pluck(users, "uid")
Run Code Online (Sandbox Code Playgroud)
添加它当然是微不足道的,但是在Python的某个地方已经存在了吗?
我真的喜欢调整?以及我的三元运算符,当它们不适合一条线时,如下所示:
var myVar = (condition
? ifTrue
: ifFalse
);
Run Code Online (Sandbox Code Playgroud)
然而,JSHint抱怨:
在"?"之前坏线断线
JSHint为什么会有此警告?是否有任何讨厌(如分号插入等)它是在保护我,还是我可以安全地更改我的JSHINT配置以忽略它?
虽然我知道GHC 中有一个TypeSynonymInstances扩展,我不知道它是多么"危险",我想知道这种限制是否是任意的,有点像单态限制,或者是否有更深层次的原因.
我最近了解到,您可以使用带有fallthrough的简洁switch语句在Javascript中设置默认参数值:
function myFunc(arg1, arg2, arg3) {
//replace unpassed arguments with their defaults:
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
Run Code Online (Sandbox Code Playgroud)
我已经成长为喜欢它,因为它不仅非常短,而且它也基于实际传递的参数而工作,而不依赖于一个特殊的值类(null,falsy等)作为占位符,就像在更传统的版本:
function myFunc(arg1, arg2, arg3){
//replace falsy arguments with their defaults:
arg1 = arg1 || "default1";
arg2 = arg2 || "default2";
arg3 = arg3 || "default3";
}
Run Code Online (Sandbox Code Playgroud)
我看到使用开关的版本之后我的初衷是我应该考虑在||版本上"默认"使用它.
开关虽然不会长得多,但它具有更加"稳健"的优点,因为它不关心参数的类型.在一般情况下,每当我必须使用默认参数创建函数时,不必担心所有伪值('',0,null,false ...)会发生什么,这听起来是个好主意.
然后,我会保留arg = arg || x实际情况,我想检查真实性,而不是将其重新用作参数默认的一般规则.
但是,当我进行代码搜索时,我发现这种模式的例子很少,所以我不得不戴上我的怀疑帽.为什么我没有找到这个成语的更多例子? …
我正在建模一个系统,该系统具有创建资源的操作以及使用该资源的其他操作.但是,给定的资源只能被使用一次 - 有没有一种方法可以保证在编译时?
具体来说,让我们说第一次操作烤蛋糕,还有另外两种操作,一种用于"选择吃"蛋糕,一种用于"选择吃蛋糕",我只能做一种或另一种.
-- This is my current "weakly typed" interface:
bake :: IO Cake
eat :: Cake -> IO ()
keep :: Cake -> IO ()
-- This is OK
do
brownie <- bake
muffin <- bake
eat brownie
keep muffin
-- Eating and having the same cake is not OK:
do
brownie <- bake
eat brownie
keep brownie -- oops! already eaten!
Run Code Online (Sandbox Code Playgroud)
通过在我们使用之后在蛋糕上设置标记,很容易强制执行限制,即不在运行时保留已经吃过的蛋糕(反之亦然).但有没有办法在编译时强制执行此操作?
顺便说一句,这个问题是为了概念证明,所以我可以使用任何可以给我静电安全的黑魔法.
我相信在下面的代码中,C"自动转换为17 int *",正如有人最近指出的那样(但没有说明原因),这是错误的.
int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
Run Code Online (Sandbox Code Playgroud)
我知道如果我在C++中做同样的事情,我会收到一个错误invalid conversion from int to int *.但是,如果我在C++中执行以下操作,它可以正常工作:
int *ptoi = (int *)17;
Run Code Online (Sandbox Code Playgroud)
这些是我认为在C中,铸造是隐含的原因.
有人可以解释为什么,在C++中,我必须使用它,但在C中,它工作正常吗?
我最近将我的项目与 github 操作连接起来以进行持续集成。我创建了两个单独的作业:第一个检查拉取请求中的代码是否被我们的 linter 接受,第二个检查代码是否通过了测试套件。我喜欢这样的两个工作在 Github 网页中显示为拉取请求的两个单独的复选标记:
我现在遇到的问题是工作流 YAML 文件中有一些重复的代码:前 3 个步骤,安装 Lua 和 Luarocks。不仅维护起来很烦人,而且两次运行相同的操作也会浪费 CI 分钟。有没有办法避免这种情况?这样设置代码只写在一个地方,并且只在工作流执行时运行一次?
但我很困惑什么是正确的方法:
这是我的工作流程的当前 YAML 文件:
name: Github Actions CI
on: [ pull_request ]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: leafo/gh-actions-lua@v8.0.0
- uses: leafo/gh-actions-luarocks@v4.0.0
- run: luarocks install luacheck
- run: ./run-linter.sh
test:
name: …Run Code Online (Sandbox Code Playgroud) 根据我的测试,它总是从左到右
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
Run Code Online (Sandbox Code Playgroud)
但我找不到相关部分在ECMAScript标准中确认这一点.
GHC给了我一个parse error on input \~如果我尝试在lambda表达式的模式上使用波形符,就像我可以用命名函数做的那样
let step = \~(x,s) -> run (f x) s -- Parse Error
let step ~(x, s) = run (f x) s -- Works fine
Run Code Online (Sandbox Code Playgroud) 如果我有多个for循环声明相同的索引变量,JSHint会抱怨:
for(var i=0; i<10; i++){
console.log(i);
}
for(var i=0; i<10; i++){ //<-- jshint warns that 'i' is already defined
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法关闭此警告?我搜索时找不到任何东西......
我想这样做的原因是我更喜欢将我的索引变量与循环一起声明,而不是将声明提升到函数的顶部.我认为重复声明是更强大的,如果我删除for循环或移动它们,我也认为它有助于传达循环变量不应该在循环外使用的意图.