我有这个代码:
trait State:
fn to_string(self) -> String:
...
struct StateTtt(State):
fn __init__(inout self):
pass
fn to_string(self) -> String:
return "ABC"
fn get_state() -> State:
return StateTtt()
fn main():
var s = get_state()
print(s.to_string())
但是它给了我错误:
无法在返回值中将“StateTtt”值隐式转换为“State”
但是 StateTtt 结构体实现了 State 特征,那么为什么它不能转换呢?
当然,这是我的代码的简化版本。在实际代码中,getState函数将根据参数创建一个结构体实例。
首先欢迎来到Mojo🔥!
特征 (
State
) 不是可返回类型,而是类型如何符合预期功能的预期实现的描述。您可以在这里阅读有关特征的更多信息:
https://docs.modular.com/mojo/manual/traits
这是经过一些修改的代码示例:
trait State:
fn to_string(self) -> String:
...
@value
struct StateTtt(State, Stringable):
var some_state_data: Int
fn __init__(inout self, some_state_data: Int = 0):
self.some_state_data = some_state_data
fn __str__(self) -> String:
return "StateTtt(" + str(self.some_state_data) + ")"
fn to_string(self) -> String:
return str(self)
fn get_state() -> StateTtt:
return StateTtt()
fn main():
var s = get_state()
print(s)
结果:
StateTtt(0)
请注意,
get_state()
与StateTtt()
没有什么不同。由于我不清楚您的目标,因此我只是回答我所看到的问题,而不是进行架构调整。
另请注意,
__str__
是已存在的 Stringable
特征的 Mojo 标准,它允许将结构体 str()
转换为 String
。
由于您的代码示例没有列出
State
和 StateTtt
背后的完整概念,我不确定这个答案是否完全回答了“问题背后的问题”,可以这么说。但我希望我能让你朝着正确的方向前进!
值得注意的是:此答案是 Mojo nightly 版本 2024.5.1515 (077049dc) 的最新答案。该语言仍在不断发展;这篇文章和任何未来的读者之间可能会发生微妙的变化。