LoginSignup
21
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-11

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

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

21
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
8