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は?
# => "みそスープ"
[雑感]
秋になるとチェーン店がイモまみれになって、特にイモが好きでもない私は「またかー」ってなる
次はカボチャまみれ