首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >直接调用fmt函数

直接调用fmt函数
EN

Stack Overflow用户
提问于 2021-06-05 10:43:30
回答 1查看 802关注 0票数 3

我试图根据参数实现不同的Display格式。比如print_json()print_pretty()。当然,我可以将其实现为返回字符串print_json(&self)->String的函数,但我想知道是否可以让print_json(&self,f: &mut Formatter<'_>) -> std::fmt::Resultprint_pretty(&self,f: &mut Formatter<'_>) -> std::fmt::Result代替。然后,我可以根据用例调用这些函数中的任何一个。但是如何直接获得Formatter的实例呢?理想情况下,我想做这样的事情

代码语言:javascript
运行
AI代码解释
复制
let mut string = String::new();
my_object.print_pretty(&mut string);
return string;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-05 12:01:38

但是如何直接获得Formatter的实例呢?

据我所知,获得格式化程序的唯一方法是通过实现Display或其他格式化特性来接收格式化程序。

基于以下核心特性,我实现了自己的方案来添加更多的格式化选项:

代码语言:javascript
运行
AI代码解释
复制
/// Objects for which alternate textual representations can be generated.
/// These are analogous to [`Display`] and [`Debug`], but have additional options.
pub trait CustomFormat<F: Copy> {
    /// Wrap this value so that when formatted with [`Debug`] or [`Display`] it uses
    /// the given custom format instead.
    fn custom_format(&self, format_type: F) -> CustomFormatWrapper<'_, F, Self> {
        CustomFormatWrapper(format_type, self)
    }

    /// Implement this to provide custom formatting for this type.
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>, format_type: F) -> fmt::Result;
}

希望支持其他格式的类型实现CustomFormat<F>,其中F是特定的格式类型或格式选项;对于您的用例,它们可以是struct Json;struct Pretty;。或者,你可以有两个不同的特征--我刚刚发现,拥有一个通用的特性可以减少代码的重复。

作为实现示例,这里我定义了std::time::Duration的自定义格式。它看起来就像一个DebugDisplay实现,只不过它需要一个额外的格式-选项参数(它会忽略这个参数,因为StatusText没有带任何额外的选项):

代码语言:javascript
运行
AI代码解释
复制
impl CustomFormat<StatusText> for Duration {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>, _: StatusText) -> fmt::Result {
        write!(fmt, "{:5.2?} ms", (self.as_micros() as f32) / 1000.0)
    }
}

使用这些工具的代码示例如下:

代码语言:javascript
运行
AI代码解释
复制
let mut string = String::new();
write!(string, "{}", my_object.custom_format(Pretty)).unwrap();
return string;

"{}"格式字符串不再控制格式;它只是一个占位符,完全可以通过实现Display (以及Debug)的CustomFormatWrapper调用格式机制来调用自定义格式:

代码语言:javascript
运行
AI代码解释
复制
pub struct CustomFormatWrapper<'a, F: Copy, T: CustomFormat<F> + ?Sized>(F, &'a T);

impl<'a, F: Copy, T: CustomFormat<F>> Debug for CustomFormatWrapper<'a, F, T> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <T as CustomFormat<F>>::fmt(self.1, fmt, self.0)
    }
}

impl<'a, F: Copy, T: CustomFormat<F>> Display for CustomFormatWrapper<'a, F, T> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <T as CustomFormat<F>>::fmt(self.1, fmt, self.0)
    }
}

这可能是一个过度设计的解决方案,为您的目的。所需的关键元素是包装器类型,它包含对要格式化的值的引用,并且它具有一些标准的格式化特征,如Display,以转发到您的自定义格式特征(或者,如果您只想自定义一种类型,那么只需要该对象上的方法)。

链接到上下文中的完整源代码

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67852867

复制
相关文章
Js 使用new关键字调用函数和直接调用函数的区别
var friend=new Person("Nicholas",29,"Software Engineer");
大道七哥
2019/09/10
3.8K0
Js   使用new关键字调用函数和直接调用函数的区别
前端html+js如何直接调用后端php函数?
实际上,可能吗?除了使用表单给后台提供数据,想想,你向Linux系统写入文件试试?什么用户,哪个组,有无write权限?这些读写权限,您能过吗?
程序员小助手
2020/04/08
4.4K0
iOS开发--performSelector调用和直接调用区别
下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结, [delegate imageDownloader:self didFinishWithImage:image]; [delegate performSelector:@selector(imageDownloader:didFinishWithImage:)withObject:self withObject:image]; 1、performSe
roc
2018/03/30
2K0
iOS开发--performSelector调用和直接调用区别
nodejs直接调用grunt(非调用批处理)
在windows下,我们做js构建工作,都习惯安装grunt-cli,只需要命令行grunt。。。一切构建工作都自动完成了。这已经是很完美的情况了,不过最近要做一个服务器版的自动化构建系统,在nodejs中调用批处理执行grunt就显得很矬,而且各种问题。是否有更好,更漂亮的方式呢? grunt本来就是nodejs程序,安装后表现为一个node_module,那么cli是什么呢?这只是一个nodejs写的命令行界面。所以,nodejs肯定可以直接在js层面调用grunt。 我们需要做的,只需要揭开cli的面
用户1258909
2018/07/03
8170
fmt命令
fmt命令用于编排文本文件,其会从指定的文件里读取内容,将其依照指定格式重新编排后,输出到标准输出设备,若指定的文件名为-,则fmt指令会从标准输入设备读取数据。
WindRunnerMax
2020/12/11
5090
python 直接调用django的model
网上几乎所有的教程这样的,但是运行的时候会报错 import os import sys import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "simple_cms.settings") django.setup() 正确的做法是还要加入一句 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 完整的就是这样: import os i
小贝壳
2020/03/05
9940
Jupyter Notebook实现直接调用R
学习了python,已经能够满足大部分需求了。但是最近学习生息和组学数据分析,以后的论文是必须要用R语言来写的。因为之前一直在用jupyter notebook来写分析报告,所以我就想也用jupyter写R,这样子就很方便了。高兴的是确实可以在jupyter中使用R。
DrugAI
2021/01/28
1.1K0
cssjshtml vue直接调用elasticsearch接口
通过headers中设置:Authorization  来通过验证,Authorization通过正常登陆页面后在headers中获取。此方法牺牲了安全。
葫芦
2019/10/25
1.8K0
unidbg直接调用so文件内方法
参考文档https://blog.csdn.net/weixin_43582101/article/details/108012579
小小咸鱼YwY
2021/09/22
2.1K0
pytest的使用_java直接调用方法
这种方式会运行所有通过装饰器 @pytest.mark.slow进行装饰的测试用例。
全栈程序员站长
2022/09/19
8370
pytest的使用_java直接调用方法
函数c()_函数的调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/15
3.6K0
JavaScript 函数调用
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
陈不成i
2021/07/19
2.2K0
MATLAB函数调用
学习Matlab自定义函数使用,并结合所学函数简单修改了一下上周的代码实现了Topsis法。
全栈程序员站长
2022/09/13
1.8K0
函数调用约定
现代的几乎所有的编程语言都离不开函数和参数的概念。而这个概念是编程语言级别的,而不是硬件级别的。也就是说硬件上本来没有函数的概念。只是函数的用的太普遍,硬件开始为函数准备专用的指令。
战神伽罗
2019/08/13
2.3K0
7.2 调用函数
把函数调用单独作为一个语句,如c=max(a,b),max(a,b)是一次函数调用,它是赋值表达式中的一部分。
小林C语言
2019/07/12
1.7K0
函数调用约定
在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。
Elapse
2020/08/17
1.9K0
关于调用函数
在调用函数时只需要传入指定数量和指定类型的值在参数表的指定位置这些值将在方法启动前赋值给形参
算法与编程之美
2022/10/28
1.5K0
关于调用函数
6.2 函数调用
既然有函数返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值 的类型
小林C语言
2019/08/19
1.3K0
调用dll函数
直接调用dll函数,rundll32 dllpath,func param1 param2 … 执行步骤
sofu456
2020/07/29
4.2K0
点击加载更多

相似问题

变量调用函数和直接调用函数

10

直接调用子函数

12

直接调用匿名函数

14

JavaScript、匿名函数调用与直接函数调用

16

防止fmt打印函数指针

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档