Ruby

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

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は?
# => "みそスープ"

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