
以下のコードを実行したとき、
何が出力されるでしょう?
※Rubyのバージョンは3.1です
pp nil.to_i
C 0
instance method NilClass#to_iは固定値0を返します。
参考:https://docs.ruby-lang.org/ja/latest/method/NilClass/i/to_i.html
a, b = 1, 2
pp a:, b:
B {:a=>1, :b=>2}
[0, 1] => a, b => c
pp c
B 1
次のように書いたものと同じ挙動です。
case [0, 1]
in a, b => c
end
このとき1はbにマッチし、その結果をcに代入する、という挙動になります。結果として次のようになります。
a #=> 0
b #=> 1
c #=> 1
pp %w[2 11 1.0].sort*?,
"1.0,11,2"
%記法の%wは文字列としての要素なので、["2", "11", "1.0"]と同様になります。
文字列としての比較なので"11"より"2"のほうが大きくなります。
また、[ ]*?,は[ ] * "?"と同様の書き方となります。
require 'set'
set = Set.new
set << 1
set << 3
set << 2
set.first #=> 1
pp set.last
NoMethodError
firstはEnumerableに定義されているメソッドのため、EnumerableがincludeされているSetでも利用できます。
Enumerableにはlastメソッドは定義されていません。Array#lastはArrayクラスのメソッドとして定義されています。
本来順序が保証されないはずのSetに対してfirstメソッドが呼び出せる点も面白いです。
pp "'"'"'"'".size
3
文字列リテラルを連続して書くと、コンパイル時に1つの文字列リテラルとして扱われる仕様があります。
この場合は、長さ1の3つの文字列リテラル"'"と'"'と"'"を連結した文字列の長さを出力しているので、答えは3となります。
x=0; pp Proc.new{|;x|x}[1]
nil
引数を受け取る箇所で;に続けて書いた引数は、ブロックローカル引数として扱われます。ブロックローカル引数として定義された変数はnilで初期化され、ブロック外の同名の変数とは別の変数として扱われます。
この場合、ブロックの外で定義したx=1はブロック内のxに引き継がれず、ブロックローカル引数xは通常の引数1を受け取ることも無いため、初期値であるnilが出力されます
if false
a = 10
end
if defined? a
a = 100
end
pp a
B 100
ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。
宣言は、たとえ実行されなくても宣言とみなされます。
参考:https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#local
何問解けましたか?
クイズをシェアする