【发布时间】:2020-06-14 01:02:38
【问题描述】:
使用 LLDB,我可以为类型添加自定义摘要:
(lldb) type summary add -s "This is a Foo" Baz.Foo
但是,对于具有两个或更多泛型的泛型类型,我无法执行此操作。
给定一个模块 Baz,其类型为 Foo,具有两个或多个泛型:
struct Foo<Bar: Numeric, Bar2: Numeric> {}
我尝试了以下方法;都没有成功:
type summary add -s "This is a Foo" Baz.Footype summary add -s "This is a Foo" Baz.Foo<A, B>type summary add -s "This is a Foo" Baz.Foo<Float, Float>type summary add -s "This is a Foo" Baz.Foo<Bar, Bar2>type summary add -s "This is a Foo" Baz.Foo<Float>
在所有情况下,打印的是标准描述而不是自定义描述。
那么如何为具有两个或更多泛型的泛型类型添加自定义摘要,最好不必为Bar 和Bar2 指定具体类型?
【问题讨论】:
-
我不熟悉摘要功能,但它能够在值上调用方法?如果是这样,您可以制作一个类似于
CustomDebugStringConvertible的摘要,并让Foo使用所需的debugDescription实现它 -
可以在 LLDB 中加载 Python 脚本,当使用
fr v命令(也可能是p命令)时,它将评估debugDescription或description属性,即实际上我的最终目标。使用type summary add -s "whatever" Module.Type,我可以成功地定位非泛型类型或只有一个泛型参数的类型。但是,我的问题是这似乎不适用于具有两个或更多泛型类型参数的类型。 -
您能否以
CustomDebugStringConvertible协议类型本身为目标,并让所有符合标准的类型(包括您的通用Foo<Bar, Bar2>)获取相同的摘要? -
这仅适用于我在定义类型摘要后第一次使用
p value as CustomStringConvertible打印任何类型的值。之后,它可以在没有as CustomStringConvertible的情况下工作。此外,这不适用于~/.lldbinit文件。因此,虽然这让我更接近我的目标,但它并不是 100%。 -
如果我使用自定义标记协议(例如
protocol FooProtocol {})而不是CustomStringConvertible,我可以通过我的~/.lldbinit文件使其工作,但它仍然需要初始演员表。