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
# ^~~
?🍣
?🍣
# => "🍣"
完全に私が無知だっただけなのですが、?
は文字リテラルです。
'🍣'
と書くよりも ?🍣
のほうが 1 文字少ないので、コードゴルフに使えますね
[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]
# => ""
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"
?? ω
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
ってかんじで!
Ruby 3 から文字列リテラルがデフォルトで Frozen になるっぽいので(そうなの?)、
# frozen_string_literal: true
を書いて準備されている方も多いと思います。事故にお気をつけを
この記事よかったです。楽しい
Perfect Frozen String Literal by @k0kubun
おわりの言葉
def 1+1は?
'みそスープ'
end
1+1は?
# => "みそスープ"
[雑感]
秋になるとチェーン店がイモまみれになって、特にイモが好きでもない私は「またかー」ってなる
次はカボチャまみれ