【发布时间】:2015-01-30 02:58:14
【问题描述】:
我完全不知道为什么这段代码不改变类型序列中的成员变量:
for p in prescrs do
p.ATC <- "A"
for c in p.Drug.Components do
for s in c.Substances do
s.DoseTotal.Adjust <- adjustKg
s.DoseTotal.Time <- "DAY"
s.DoseTotal.Unit <- s.DrugConcentration.Unit
s.DoseRate.Adjust <- adjustKg
s.DoseRate.Time <- "DAY"
s.DoseRate.Unit <- s.DrugConcentration.Unit
prescrs 是一系列 Prescriptions,它是一个非常简单的“POCO”,定义为具有成员值的类型。我不知道为什么这不起作用。
我尝试了一个简单的测试用例,例如:
type IterTest () =
member val Name = "" with get, set
member val IterTests = [] |> List.toSeq : IterTest seq with get, set
let iterseq =
[
new IterTest(Name = "Test1")
new IterTest(Name = "Test2")
]
|> List.toSeq
iterseq |> Seq.iter(fun x -> x.IterTests <- iterseq)
iterseq |> Seq.iter(fun x ->
x.IterTests
|> Seq.iter(fun x' -> x'.Name <- "itered"))
但是这里的结果与预期的一样。所以,甚至不能完全重现我的问题???
找到了解决方案(没有真正理解上面的问题)。当我第一次将 prescrs 序列转换为如下列表时:
let prescrs = prescrs |> Seq.toList
然后执行命令式循环,属性会发生变异。
【问题讨论】:
-
“这不起作用”是什么意思?
prescrs是怎么产生的? (顺便说一句,let prescrs = prescrs |> Seq.toList是转换,而不是演员表。) -
@ildjarn 我的意思是“不起作用”,属性没有改变。在第二个示例中,属性确实发生了变化。这两个示例都是对序列的迭代,所以我期望相同的行为。
-
但是你怎么知道值没有改变呢?也许您的测试有缺陷...
prescrs是如何产生的? 当您没有为相关上下文显示足够的代码时,您希望如何获得帮助? -
@ildjarn 看到下面的答案,我现在很高兴,感谢您对此进行调查。
标签: f# seq imperative