Help us understand the problem. What is going on with this article?

ゆるふわ Ruby エンジニアが矢を受けた小ネタ集

More than 1 year has passed since last update.

Ruby よくわかんなくなっちゃった

Ruby の小ネタ集です。
ぜんぜんわからない。私は雰囲気で Ruby を書いている。

'ゆるゆり♪♪'.next

'♪'.next
# => "♫"

'ゆるゆり♪♪'.next
# => "ゆるゆる♪♪"

( ´Ꙩωꙩ` )

Ruby リファレンスマニュアル: instance method String#next

self にアルファベットや数字とそれ以外の文字が混在している場合、 アルファベットと数字だけが「次の」文字になり、残りは保存されます。

042

042
# => 34

0 から始まる整数は 0o と同じく、8進数の扱いになるみたいです。
これって Ruby に限らないことなのかな

0_42
# => 34

0o_42
# SyntaxError (numeric literal without digits)
# 0o_42
# ^~~

:clap::cry:

?🍣

?🍣
# => "🍣"

完全に私が無知だっただけなのですが、? は文字リテラルです。
'🍣' と書くよりも ?🍣 のほうが 1 文字少ないので、コードゴルフに使えますね :golf::basketball_player:

[true, false, nil].one?

[true, false, nil].one?
# => true

完全に私が無知だっただけなのですが、
Array#one? は真(nil, false 以外)となる要素の数が 1 のときに true を返します。
ブロックを与えると、真偽をブロックの評価で行ってくれます。

'abc'[1.4142]

'abc'[1.4142]
# => "b"

String#[]Array#[] の引数は to_int されるため、

1.4142.to_int
# => 1
'abc'[1]
# => "b"

となるみたいです。

'abc'[3..3]

'abc'[4..4]
# => nil
'abc'[3..3]
# => ""
'abc'[3..2]
# => ""
'abc'[3..4]
# => ""

:sleeping:
Ruby リファレンスマニュアル: instance method String#[]

cat = 'nya' if false

cat.nil?
# => NameError (undefined local variable or method `cat' for ...)

cat = 'nya' if false
cat.nil?
# => true

Ruby リファレンスマニュアル: ローカル変数

宣言は、例え実行されなくても宣言とみなされます。

ははぁん。

+str << 'piyo'

str = 'hoge'.freeze # または -'hoge'
+str << 'piyo'
str
# => "hoge"

?? :eye:ω :eye:

Frozen なオブジェクトへの変更、
たとえば以下のように << を使ってオブジェクトに文字列を追記すると FrozenError が発生します。
+= は新規オブジェクトを作って再代入するのでエラー出ないです)

str = 'hoge'.freeze
str << 'piyo'
# => FrozenError (can't modify frozen String)

なので、String#+@ したりするのですが、
これはレシーバが Frozen な場合に同じ文字列から成る、Frozen でない新規オブジェクトを生成するので、
その新規オブジェクトに << で追記しても str に代入されず、どこかへ飛んでいってしまいます。じゃあの。

str = 'hoge'.freeze
str.object_id
# => 47425922840860
+str.object_id
# => 47425922840860 (同じオブジェクト。呼び出し優先度が +@ よりも object_id のほうが高いため)
(+str).object_id
# => 47426029865800 (別のオブジェクト!)

Ruby リファレンスマニュアル: instance method String#+@

凍ったオブジェクトが代入されてる変数に追記して再代入して...とするなら、素直に += つかったほうが良さそう。

str = 'hoge'.freeze
str += 'piyo'
str
# => 'hogepiyo'
str.frozen?
# => false

もう一度冷凍するなら (str += 'piyo').freeze ってかんじで! :snowflake:

Ruby 3 から文字列リテラルがデフォルトで Frozen になるっぽいので(そうなの?)、
# frozen_string_literal: true
を書いて準備されている方も多いと思います。事故にお気をつけを :helmet_with_cross:

この記事よかったです。楽しい
Perfect Frozen String Literal by @k0kubun

おわりの言葉

def 1+1は?
  'みそスープ'
end

1+1は?
# => "みそスープ"

[雑感]
秋になるとチェーン店がイモまみれになって、特にイモが好きでもない私は「またかー」ってなる
次はカボチャまみれ

rigani
絵の休憩にコード書いて、コードの休憩に絵を描いてます👏 Ruby と CSS がすこ
https://rigani.me
basicinc
マーケティングとテクノロジーで社会のあらゆる問題を解決する集団
https://tech.basicinc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away