Day08 - Ruby比一比:String的+=与concat串接

本文探讨了Ruby语言中concat和+=方法在字符串连接上的差异,通过object_id展示了两者在内存管理上的不同行为,concat保持原始对象不变,而+=则可能导致对象内存位置变化。

前情提要:

在第七天我们透过比较Symbol和String,发现字串比符号多了更多方法!为了活用string method,今天我们接续前文,来探讨一题跟字串有关的题目:

Ruby经典面试题目#08(leafor)
+=和concat有什么不同?What’s difference between concat and +=?

concat是英文concatenate的缩写,意思是串接(link things together in a chain or series.)我们想知道的是:串接完之后,仍然会指向同一个物件(使用同一个內存位置)吗?

要解答此一问,必须使用前一篇所使用的印出內存位置方法.object_id。

我们来创造一个属于第八天的、指向第八天的字串物件的变数tingsmessage:

tingsmessage =“This is my 8th article!”
p tingsmessage.object_id
內存位置在:

47023721077820
第八天呢!新的一周开始,值得欢呼一下:

tingsmessage.concat“Yay!”
p tingsmessage
p tingsmessage.object_id
印出来的结果,仍是在第八天的位置欢呼唷:)

This is my 8th article!Yay!
47023721077820
如果用+=方法呢?

tingsmessage +=“Plus One Everyday!”
p tingsmessage
p tingsmessage.object_id
加了+=每天都加一篇这段叙述,结果內存位置随着+方法而改变了:

This is my 8th article!Yay!Plus One Everyday!
47358398608700
按照第七天文章的结论,读取相同內存位置不会变来变去,时间耗费短,因此concat方法较省时。+ or .concat,what is faster for appending string in Ruby?这篇文章的作者已经在ruby帮我们做了一个串接string的benchmark实验,非常有趣。

提到了concatenation串接,通常会和interpolation插入拿来一起谈。

如果我们在明天、想要调整第9天的message呢(xcsjbj)?

换汤不换药,其实大部分的信息字串都是一样的,只是天数改变,所以我们可以设一个整数变数tingsironmanday,将数字Number转为字串String,利用刚刚学的+方法串再一起:

tingsironmanday = 9
p“I've written”+ tingsironmanday.to_s +“articles!”
# =>“I've written 9 articles!”
interpolation概念,就是#{}大括号包住数字变数,此方法自动会帮我们转换数字为字串,让代码更简洁,可读性更高。:)

p“I've written #{tingsironmanday} articles!”
# =>“I've written 9 articles!”
从今天举的例子们可以发现在ruby里实作的功能,总是会有不同的写法,让我们可以根据情况选择适合自己最佳的使用时机,这些设计是不是很聪明呢?

转载于:https://www.cnblogs.com/lannyQ-Q/p/10760621.html

<think>首先,用户的问题是关于Kingbase数据库执行INTERVAL concat报错的解决方法。用户提到了在Kingbase中使用INTERVAL函数时,尝试用CONCAT拼接字符串报错,具体错误是“不能够从boolean到interval转换类型”。 回顾用户提供的引用: - 引用[3]详细讨论了这个问题:用户尝试使用类似`SELECT order_id, order_date + (hours || ' hours')::INTERVAL AS new_date FROM orders;`的写法,但在人大金仓KingbaseES中报错,提示不能从boolean转换到interval。这是因为Kingbase可能不支持`||`操作符的这种用法,将其解释为boolean类型。 - 引用[3]中的解决方案是使用CONCAT函数来代替`||`拼接字符串,例如:`SELECT sourceDate + CONCAT(addMonth, ' month')::INTERVAL AS resultDate FROM table;`。 用户的问题直接指向这个错误,所以我需要基于引用[3]提供解决方法。 我的回答结构: 1. **理解问题**:先确认用户的问题,解释错误原因。 2. **提供解决方案**:给出具体的SQL写法。 3. **示例代码**:展示如何正确使用CONCAT函数。 4. **注意事项**:提醒用户其他可能的变体。 5. **生成相关问题**:根据系统指令,在回答末尾生成相关问题。 系统指令要求: - 所有行内数学表达式用$...$,但这里不涉及数学,所以忽略。 - 独立公式用$$...$$,但同样不适用。 - LaTeX语法正确:在代码块中正确显示SQL。 - 使用中文回答。 - 生成相关问题:在末尾添加。 - 回答结构清晰:逐步解决问题。 回答大纲: 1. 介绍问题:解释Kingbase中INTERVAL CONCAT报错的原因。 2. 解决方案:基于引用[3],建议使用CONCAT函数。 3. 代码示例:提供修改后的SQL代码。 4. 其他建议:如果有,添加额外提示。 5. 相关问题:生成3-4个相关问题。 相关问题应该基于主题: - Kingbase数据库的常见问题。 - INTERVAL函数的其他用法。 - 数据库迁移问题。 - 性能优化等。 最终回答: - 开头:直接回应问题。 - 主体:解释解决方案。 - 结尾:相关问题。</think>### Kingbase 执行 INTERVAL CONCAT 报错解决方法 在 Kingbase 数据库(基于 PostgreSQL)中,当尝试使用动态拼接字符串来构建 INTERVAL 表达式时,如果使用 `||` 操作符(如 `(hours || ' hours')::INTERVAL`),可能会遇到错误提示:“不能够从boolean到interval转换类型”。这是因为 Kingbase 在某些版本中会将 `||` 错误地解释为布尔操作符,而非字符串拼接符[^3]。以下是逐步解决此问题的方法。 #### 问题原因分析 - Kingbase 对 SQL 语法的处理标准 PostgreSQL 存在差异,特别是在动态拼接字符串时。 - 错误示例:`SELECT order_date + (hours || ' hours')::INTERVAL FROM orders;` 会导致类型转换错误,因为 `||` 被误判为布尔表达式[^3]。 - 核心问题:Kingbase 不支持 `||` 在 INTERVAL 拼接中的直接使用,需要改用其他函数。 #### 解决方案:使用 CONCAT 函数 基于引用[3]的解决方案,推荐使用 `CONCAT` 函数来安全拼接字符串,避免类型错误。`CONCAT` 能正确处理字符串连接,确保结果可转换为 INTERVAL 类型。 ##### 修改后的 SQL 语法 ```sql SELECT source_date AS sourceDate, add_month AS addMonth, (source_date + CONCAT(add_month, ' month')::INTERVAL) AS resultDate FROM your_table; ``` **关键修改点:** - 将 `||` 替换为 `CONCAT(add_month, ' month')`,其中 `add_month` 是整数或字符串字段,表示要添加的时间单位(如月份)。 - 使用 `::INTERVAL` 显式转换拼接后的字符串为间隔类型。 - 支持的时间单位包括 `'year'`、`'month'`、`'day'`、`'hour'` 等(需小写)。 ##### 示例说明 假设有一个表 `sales`,包含日期字段 `sale_date` 整数字段 `delay_months`,需要计算延迟后的日期: ```sql -- 正确写法:使用 CONCAT 避免报错 SELECT sale_date AS original_date, delay_months AS delay, (sale_date + CONCAT(delay_months, ' month')::INTERVAL) AS delayed_date FROM sales; ``` - **输入**:`sale_date = '2023-01-01'`, `delay_months = 2` - **输出**:`delayed_date = '2023-03-01'` #### 注意事项 1. **字段类型**:`add_month` 等字段应为整数或可转换为字符串的类型。如果字段是字符串,需确保其值为数字格式(如 `'2'`)。 2. **单位大小写**:时间单位必须小写(如 `'month'` 而非 `'MONTH'`),否则可能引发语法错误。 3. **复杂拼接**:如需拼接多个单位(如“2年3个月”),使用嵌套 CONCAT: ```sql SELECT sale_date + (CONCAT(2, ' year ') || CONCAT(3, ' month'))::INTERVAL FROM sales; ``` 但优先推荐单个单位操作,避免嵌套错误。 4. **版本兼容性**:此解决方案在 Kingbase V8 及以上版本测试有效[^3]。如果问题依旧,检查数据库日志或升级到最新版本。 通过上述方法,您可以高效地实现类似 SQL Server 的 `DATEADD` 功能,支持国产化迁移场景[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值