Elm项目访问interval.start/end报错:This is not a record, so it has no fields to access!
问题解决:Elm中访问Interval字段提示“This is not a record, so it has no fields to access!”
错误原因
你定义的Interval是自定义联合类型(Union Type),构造函数Interval包裹了一个record,但直接对Interval类型的值使用.start/.end是无效的——Elm需要先解构出包裹在构造函数里的record,才能访问其字段。
修复步骤
- 解构Interval值:在
view函数的参数里直接用模式匹配提取内部的record,把view interval =改成view (Interval intervalRecord) =。 - 修正字段访问:把代码里所有
interval.end替换成intervalRecord.end,同时注意你代码里startText错误地用了interval.end,应该改成intervalRecord.start。
修正后的完整代码
view : Interval -> Html msg view (Interval intervalRecord) = let startText = div [class "interval-start"] [text (Date.dateToStringForView intervalRecord.start)] endText = case intervalRecord.end of Just endDate -> div [class "interval-end"] [text (Date.dateToStringForView endDate)] Nothing -> div [class "interval-end"] [text "Present"] lengthText = case length (Interval intervalRecord) of Just (years, months) -> div [class "interval-length"] [text (String.fromInt years ++ " years, " ++ String.fromInt months ++ " months")] Nothing -> text "" in div [class "interval"] [ startText , endText , lengthText ]
补充说明
如果后续需要在其他函数里访问Interval的字段,都要先通过模式匹配解构,比如:
getIntervalStart : Interval -> Date getIntervalStart (Interval intervalRecord) = intervalRecord.start
内容的提问来源于stack exchange,提问作者Cornel
相关产品推荐
相关产品推荐

