Edited at

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

[雑感]

秋になるとチェーン店がイモまみれになって、特にイモが好きでもない私は「またかー」ってなる

次はカボチャまみれ