blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】Gold試験対策-できなかった問題

以下の出力結果になるような選択肢
[1,2,3].__(1)__
#=> 6

1.sum
2.inject(0){|sum, i| sum * i }
3.inject(0){|sum, i| sum + i }
4.add
RubyのSilverの流れだとsumとかaddとかいう便利なメソッドがあるんではないかなんて思ってしまうわけですが、そんなものはありません笑
addはSetクラスならあるみたいだけど、足すのではなく追加する方でした。

require 'set'
Set[1,2,3].add 4 #=> #<Set: {1, 2, 3, 4}>

脇道にそれましたが、今回はinjectです。injectは引数に初期値と手続きを取ります。簡単なサンプル。

p [1, 2, 3].inject(0) {|sum, i| sum + i}
p [1, 2, 3].inject {|sum, i| sum + i}
p [1, 2, 3].inject(0, :+)
p [1, 2, 3].inject(:+)
# どれも6を出力。

初期値は省略可能で、省略すると配列の0番目が初期値として渡されます。
書き方は直感的ではないけど、使えればコードがスッキリしそうですね!!

以下のコードの実行結果
class Class1
  def set_value(value)
   @value = value
  end


  def get_value
    return @value
  end
end

obj1 = Class1.new
obj1.set_value("value1")
puts obj1.get_value
obj2 = Class1.new
puts obj2.get_value

つまりは初期化されていない(ように見える)インスタンス変数にアクセスするとどうなるか?答えはnil

以下のコードの実行結果は?
var1 = :hello
var2 = :hello
puts var1.equal?(var2)

シンボルオブジェクトの問題。こたえはtrue。シンボルオブジェクトは文字列が同じならオブジェクトとしておなじ!

以下の宣言だと値はどう振られる?
a, b = [1, 2, 3, 4]

aに1、bに2が入る。可変長でないため配列をぶったぎることはできません。同時に宣言できる可変長変数は一つだけ。

a, *b, c = [1, 2, 3, 4]
p a # 1
p b # [2, 3]
p c # 4


injectにはまりすぎたせいで他のを書く時間がなくなってしまった…。