我对这个例子的结果有点困惑:
(define mk-q
(lambda ()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么两个x原子都被set-car!程序所取代(我对结果的第一个猜测是什么((x) y))?
例如:
(define mk-q2
(lambda ()
(let ([l '(x)])
(cons l (cons l l)))))
(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Run Code Online (Sandbox Code Playgroud)
为什么x第一个例子中的两个都被替换了?
我想测试传递给我的CLI程序的其他(正确/不正确)命令行参数,但是由于flag redefined出现错误,我不确定如何使用go / testing包实现此功能。好像发生了,因为flag.Parse()只能被调用一次。测试传递给go程序的不同命令行参数的正确方法是什么?有什么办法可以定义类似的东西setup()/teardown()或单独运行每种情况(但在同一文件中)?
这是我的代码:
测试功能:
func (p *Params) Parse() (*Params, error) {
param1Ptr := flag.String("param1", "default", "param1 desc")
param2Ptr := flag.String("param2", "default", "param1 desc")
...
...
flag.Parse()
...
}
Run Code Online (Sandbox Code Playgroud)
测试文件:
包主
import (
"os"
"testing"
)
func TestParam1(t *testing.T) {
os.Args = []string{"cmd", "-param1", "incorrect", "-param2", "correct"}
params := Params{}
_, err := params.Parse()
...
...
}
func TestParam2(t *testing.T) {
os.Args = []string{"cmd", "-param1", "correct", "-param2", "incorrect"}
params := Params{}
_, err …Run Code Online (Sandbox Code Playgroud) 假设我们有 2 个结构:
defmodule Algo.A do
defstruct id: nil, foo: nil
end
defmodule Algo.B do
defstruct id: nil, bar: nil
end
Run Code Online (Sandbox Code Playgroud)
以及以下按结构类型过滤的 API:
defmodule Algo do
alias Algo.{A, B}
def filter_by_type(collection, %A{}) do
for %A{} = el <- collection, do: el
end
def filter_by_type(collection, %B{}) do
for %B{} = el <- collection, do: el
end
end
Run Code Online (Sandbox Code Playgroud)
预期的行为只是根据理解中的匹配返回一个集合:
test "filters by struct type" do
collection = [%A{id: 1}, %A{id: 2}, %B{id: 3}]
assert [%A{id: 1}, %A{id: 2}] = Algo.filter_by_type(collection, %A{})
assert …Run Code Online (Sandbox Code Playgroud)