Template Toolkit:如何实现宏/块向调用者返回哈希?
在Template Toolkit中编写返回哈希引用的宏
当然可以实现!Template Toolkit的宏(MACRO)本身就支持返回哈希引用,你遇到的HASH(0x32e42e4)其实是引用的字符串化显示,而非宏没有返回正确的引用。下面给你两种可行的实现方式:
方法1:直接返回哈希构造器
可以在宏的块末尾直接写哈希构造表达式,它会自动成为宏的返回值:
[% MACRO MakeSomeThing(something) BLOCK; # 直接将哈希构造作为最后一行,作为宏的返回值 { a => 'a', b => something, c => 'c' }; END; # 调用宏,得到哈希引用 newOb = MakeSomeThing('foo'); # 访问哈希的键值对,验证是否正确返回 newOb.b; # 会输出 'foo' # 用dumper查看完整结构 dumper.dump(newOb); %]
方法2:通过变量返回哈希引用
如果你需要先对哈希做一些额外处理,可以先将哈希引用赋值给变量,再把变量作为块的最后一行:
[% MACRO MakeSomeThing(something) BLOCK; s = { a => 'a', b => something, c => 'c' }; # 这里可以添加更多逻辑,比如修改哈希的键值 s.d = 'extra'; # 将变量作为最后一行,返回哈希引用 s; END; newOb = MakeSomeThing('foo'); # 验证访问 newOb.d; # 输出 'extra' %]
关于你看到的HASH(0x...)字符串
当你直接输出哈希引用变量(比如[% newOb %])时,Template Toolkit会自动将其字符串化,显示为类似HASH(0x32e42e4)的格式,但这并不意味着变量不是哈希引用——你依然可以通过newOb.key的方式访问它的键值,或者用dumper工具完整输出哈希的内容。
如果你的dumper.dump输出的还是字符串化的结果,检查一下是否正确传递了引用:比如直接传newOb而不是将它包在另一个哈希里(当然包进去也应该能显示内部结构,可能是dumper插件的配置问题,确保你使用的是TT的Dumper插件并正确加载)。
内容的提问来源于stack exchange,提问作者vlad_tepesch




