免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Ruby `<<` 操作符详解

Ruby `<<` 操作符详解 在 Ruby 里不是单纯的移位运算符虽然数字也支持移位更多是一个实例方法#不同类有完全不同的语义是重载的操作符。语法obj something本质等价obj.(something)一、最常用场景追加可变对象原地修改1. String# 字符串追加原地修改重点直接修改原字符串对象不会生成新字符串object_id 不变shiputs s.object_id s worldputs s# hi worldputs s.object_id# 和上面一样原地修改对比s xxx返回新字符串原对象不变。shis2s worldp s# hi2. Array# 数组追加元素原地修改往数组尾部追加元素等价于pusharr[1,2]arr3p arr# [1,2,3]# 链式调用因为 返回自身arr45p arr# [1,2,3,4,5]⚠️ 注意是追加一个元素arr[1,2]arr[3,4]p arr# [1,2,[3,4]] 嵌套数组不是合并# 如果想要合并数组用 concat 或者 arr.concat([3,4])3. Hash 不支持 Hash 没有#方法h xxx直接报错。二、Integer# 位运算左移数字不可变数字的是二进制左移数字是不可变对象返回新数字不修改原值12# 1 的二进制 0b1 左移2位 → 0b100 4# 公式n k n * (2 ** k)puts32# 3 * 4 12数字的不会修改原变量a3a2puts a# 3不变因为生成新数字没有赋值回去aa2puts a#12三、其他内置类的 IO#向流写入内容stdout hello$stdouthello\n# 等价 puts但不自动换行Range、Symbol没有方法四、自定义类也可以重载 Ruby 可以自己定义方法classBoxdefinitializeitems[]enddef(item)itemsitemself# 返回自身支持链式调用endattr_reader:itemsendbBox.newbapplebananap b.items# [apple, banana]五、高频踩坑点坑1String# 原地修改带来引用副作用s1hellos2s1 s1!puts s2# hello! s1 s2 指向同一个对象一起变这就是前面我们讲可变对象时的经典坑坑2Array 数组会嵌套而不是扁平化arr[1,2]arr[3,4]p arr# [1,2,[3,4]] ❗嵌套坑3区分和对象String原地修改原字符串返回self返回新字符串原对象不变Array原地追加元素返回self返回新数组合并内容Integer位左移返回新整数算术加法六、快速记忆String / Array 的 原地追加返回自己支持链式可变对象小心引用共享Integer 的 二进制左移生成新数字obj x本质是调用obj.(x)Ruby 运算符重载
返回列表