假设我有一个带字符串属性b的简单结构a:
type A struct {
B string
}
Run Code Online (Sandbox Code Playgroud)
以下代码使用A类型的数组:
testArray := []A{A{}}
testArray[0].B = "test1"
fmt.Println(testArray[0].B)
Run Code Online (Sandbox Code Playgroud)
将按预期打印出"test1".
但是这段代码似乎同样简单:
testMap := make(map[string]A)
testMap["key"] = A{}
testMap["key"].B = "test2"
fmt.Println(testMap["key"].B)
Run Code Online (Sandbox Code Playgroud)
不会打印出"test2",而是会导致以下错误:
无法分配到testMap ["key"].B
那么,为什么分配给映射中的子属性会导致错误,同时分配给数组中的子属性按预期工作?我想知道为什么这对地图不起作用以及为什么它对数组起作用.我也很想知道他们为什么设计这两种数据结构之间存在差异的语言.
我正在扩展一个抽象类,它在其构造函数中定义了一个隐式参数。
似乎有 3 种不同的方法可以做到这一点:
abstract class Base(z: ZType)(implicit a: AType)
// Explicit
class First(z: ZType, a: Atype) extends Base(z)(a)
// Explicitly pass a into the child class which
// implicitly passes it into the parent class
class Second(z: ZType, implicit val a: AType) extends Base(z)
// Implicitly passed into both
class Third(z: ZType)(implicit a: AType) extends Base(z)
Run Code Online (Sandbox Code Playgroud)
也许这取决于将如何使用子类。就我而言,子类不会有隐含AType
的作用域,所以我倾向于第二种选择。
我对第二个选项最大的担忧是,我现在为同一类型定义了 2 个隐式,一个在父类中,一个在子类中。由于它们始终是同一个对象,这有什么影响吗?出于任何原因,我应该避免第二种模式吗?
基本上,这里是否有“正确”的模式,或者所有这些都可以接受,具体取决于它们所使用的代码的上下文?
我知道,将yield转换为一系列flatMaps,然后是最终地图.我发现自己经常希望它在最终的flatMap中结束.到目前为止,我的解决方法是进行收益率,然后进行平仓,如下所示:
val aOpt = Some("a")
val bOpt = Some("b")
def fakeComplexFunc(s1: String, s2: String): Option[String] = Some(s1 + s2)
(for {
a <- aOpt
b <- bOpt
} yield {
// Pretend this is a long block with lots of stuff in it
fakeComplexFunc(a, b)
}).flatten
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?对于像这样的案件,有什么最佳做法吗?如果我最终陷入这种境地,我是否做了一些彻底错误的事情?