Ruby中的字符串转换方法

在Ruby中,你可以使用各种方法来转换字符串。下面是一些常用的方法,当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的,看看我们怎么处理哈。

在这里插入图片描述

1、问题背景

在Python中,内置的数据结构都有一个内置的to-string方法,当打印一个变量时,字符串会被方便地格式化为反映所用的数据结构。例如:

>>>$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
$>>> a = [1,2,3,4]
$>>> str(a)
'[1, 2, 3, 4]'
$>>> print a
[1, 2, 3, 4]
$>>> d = { "a":"a", "b":"b", 1:5 }
$>>> str(d)
"{'a': 'a', 1: 5, 'b': 'b'}"
$>>> print d
{'a': 'a', 1: 5, 'b': 'b'}
$>>> x = [1, 23, 4]
$>>> print x
[1, 23, 4]

请注意,当我打印a时,值是[1, 2, 3, 4]。

然而,在Ruby中,当我尝试做同样的事情时,我得到了这样的结果:

>>>$ irb
irb(main):001:0> x = [1,23,4]
=> [1, 23, 4]
irb(main):002:0> x.to_s
=> "1234"
irb(main):003:0> puts x
1
23
4 
=> nil
irb(main):004:0> print x
1234=> nil
irb(main):005:0> h = { "a" => "a", 1 => 5, 'b'=>'b' } 
=> {"a"=>"a", "b"=>"b", 1=>5}
irb(main):006:0> print h 
aabb15=> nil
irb(main):007:0> h.to_s
=> "aabb15"
irb(main):008:0> puts h
aabb15
=> nil
irb(main):009:0>

如您所见,to_s方法没有格式化。此外,如果我调用to_s对[1,2,3,4]和[1,23,4]和[1234]进行比较,则存在唯一性问题,因为to_s将所有元素都聚集在一起,因此它们最终都变成“1234”。我知道我可以尝试通过覆盖to_s方法(“[+ a.join(",") + ]” #仅适用于数组)来模拟Python内置的to-string方法,但我想知道是否有更好的选择,因为破解它似乎违反了convention-over-configuration的概念。

那么,有没有Ruby等价于Python的内置to-string方法?

2、解决方案

在Ruby中,通常有四种方法可用于获取对象的字符串表示形式。

**1、#to_str:**这是Ruby的标准类型转换协议的一部分(类似于to_int、to_ary、to_float、……)。仅当对象实际上确实是一个字符串但由于某种原因不是String类的实例时才使用它。它非常罕见。事实上,在整个核心库中,只有String类本身的空操作实现。

**2、#to_s:**这也是Ruby的标准类型转换协议的一部分(类似于to_i、to_a、to_f、……)。如果对象有一些合理的字符串表示,则使用它。它实际上不必是一个字符串。几乎所有对象都应该响应。

**3、Kernel#String(obj):**这也是Ruby的标准类型转换协议的一部分(类似于Kernel#Integer(obj)、Kernel#Array(obj)、Kernel#Float(obj)、……)。它与obj.to_s相同。

**4、#inspect:**它应该返回对象一个适用于调试目的的人类可读描述。换句话说:它是用于检查对象(duh)。

有三种方法用于打印对象:

**1、Kernel#print(obj, …):**打印所有obj,用 ,分隔,并以 ,分隔,并以 ,分隔,并以,作为结尾。如果obj不是String,print将首先调用obj.to_s。

**2、Kernel#puts(obj, …):**基本上等同于$stdout.puts(obj, …)。它也打印obj,但通常使用换行符将它们分隔开。但是,它还有一些特殊情况的行为,特别是它通过在新行上打印每个项目来特殊处理数组。

**3、Kernel#p(obj, …):**类似于puts,但对所有obj调用#inspect。

除了这些之外,标准库中还有pp(pretty print)库,它添加了一个Kernel#pp(obj, …)方法。

然后,还有awesome_print库和hirb。

这些只是Ruby中字符串转换的一些常见方法,还有其他更多的方法可供探索和使用。如果大家有更多的问题可以留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/606165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高,CPU也出现异常 关闭虚拟机重新开启,还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

visa/masterCard虚拟信用卡可以用于欧洲亚马逊店Amazon铺吗?欧洲亚马逊Amazon店铺扣租金

亚马逊是网络上最早开始经营电子商务的公司之一,亚马逊成立于1995年,一开始只经营网络的书籍销售业务,现在则扩及了范围相当广的其他产品,已成为全球商品品种最多的网上零售商和全球互联网企业。 很多小伙伴需要开多个站点店铺&a…

软胶囊硬度计:QC部门保障药品质量的精准工具

软胶囊硬度计:QC部门保障药品质量的精准工具 一、引言 随着医药行业的快速发展和药品监管力度的加强,制药企业对于药品质量的要求越来越高。在药品的生产过程中,软胶囊作为一种常见的剂型,其硬度的控制对于药品质量至关重要。软胶…

数组进了多个obj,但是 在修改某个num值时,导致别的num值也发生了变化如何解决?

问题如下: 遇到的问题,数组monthArr1 push进了多个obj,但是 在修改某个num值时,导致别的num值也发生了变化。 而这就是深拷贝浅拷贝的问题。 解决浅拷贝使用深拷贝最简单方法 :JSON.parse(JSON.stringify(obj)) 或者: 使用深拷…

学习Java的日子 Day44 HTML基础

Day44 HTML 学习路线: 前端:展示页面、与用户交互 — HTML 后端:数据的交互和传递 — JavaEE/JavaWeb 1.网页的组成部分(HTMLCSSJavaScript) 前端开发的工作模式:开发输出htmlcssjs HTML:页面结构 CSS:页面…

【linux】——日志分析

1. 日志文件 1.1 日志文件的分类 日志文件: 是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的“日记". 日志文件对于诊断和解决系统中的问题很有帮助,系统一旦出现问题时及时分析日志就会“有据可查”。此外。当主机遭受攻…

JVM的垃圾回收

JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机:是指通过软件模拟的具有完整硬件功能、运行在一个完全隔离的环境中完整计算机系统 1.JVM的内存区域划分 jvm是一个java进程 每一个java进程就是一个jvm实例 一个进程运行过程中 就要从操作系…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

软件试运行方案,试运行报告(word原件获取)

一、 试运行目的 (一) 系统功能、性能与稳定性考核 (二) 系统在各种环境和工况条件下的工作稳定性和可靠性 (三) 检验系统实际应用效果和应用功能的完善 (四) 健全系统运行管理体制&…

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中,Stream流是Java 8引入的一个重要概念,它提供了一种新的处理集合的方式,可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作,比如过滤、映射、排序、聚合等,同时也支持并行处理&#xf…

Vue 项目 尚品汇(二)(暂停进行)

一、Home 模块组件拆分 基本流程 先写静态页面 拆分静态组件 获取服务器的数据进行展示 动态业务 (一)三级联动组件 如果一个组件在很多模块之间都在使用,我们就拆分成成一个全局组件 只需注册一次 在全局的项目都能使用 三级联动在 …

Java:就业市场上的常青树-永远的宠儿

除了兴趣,我们学习编程最主要的目标是找一份好工作,选择合适的编程语言就非常重要了,毕竟选择大于努力,男怕选错行,学编程最怕选错语言。比如,如果你选Perl,那就糟糕了,基本上可以断…

高效备战!2024年陕西省绿色工厂申报条件好处和各地区奖补

什么是绿色工厂? 绿色工厂是制造业的生产单元,是绿色制造的实施主体,属于绿色制造体系的核心支撑单元,侧重于生产过程的绿色化。 通过采用绿色建筑技术建设、改造厂房,预留可再生能源应用场所和设计负荷,…

PyQt5中的事件与信号处理

文章目录 1. 简介1.1事件(Event)1.2 信号(Signal)与槽(Slot)1.3 自定义信号 2. 一个信号与槽的简单示例13. 一个信号与槽的简单示例24. 事件发送者5. 创建自定义信号6. 一个简单计算器 1. 简介 在PyQt5中,事件和信号处理是GUI编程的核心概念。事件是指用户操作或系…

吴恩达机器学习笔记:第 9 周-16推荐系统(Recommender Systems) 16.3-16.4

目录 第 9 周 16、 推荐系统(Recommender Systems)16.3 协同过滤16.4 协同过滤算法 第 9 周 16、 推荐系统(Recommender Systems) 16.3 协同过滤 在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了…

codeforce#937 (div4)题解

E. Nearly Shortest Repeating Substring 给出字符串s,是否存在长度为k的字符串多次拼接后得到的字符串与s最多有一位不同 由题意得,k一定是n的因数,所以暴力枚举就好,求出满足 s [ i ] s [ i m o d k ] s[i] s[i \mod k] s[…

C++之初阶模板

个人主页:救赎小恶魔 欢迎大家来到小恶魔频道 好久不见,甚是想念 今天我们要深入讲述C内存管理 目录 引言: 模板 1. 泛型编程 2. 模板函数 2.1函数模板的原理 2.2模板函数的实例化 2.3函数模板的匹配 3.类模板 STL STL 的主要组…

[答疑]关于《评“状态和事件本质相同”》的6个疑问

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 丁绍恒 2024-5-8 16:17 (补注:上图摘自https://mp.weixin.qq.com/s/QhAhSdET5psZQEEW6f9KoA) 1、您提到“【警戒条件】是一个【表达式】&#xff0…

内网安全综合管理系统是什么 | 好用的那我王安全管理系统有哪些

内网安全综合管理系统是指一种集成终端管理、网络管理、内容管理、资产管理等功能的综合性安全管理系统。它主要对内网上的主机进行统一安全管理,包括对网络主机用户操作实施监督控制,并对主机中的安全软件(如主机入侵监测系统、主机防火墙和…