iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 20

Codewars Ruby Challenge - Day 20/30

  • 分享至 

  • xImage
  •  

學習

  1. 變數賦值的方式:我前面其實已經有提過,可以把多行的變數賦值寫成一行,像是 a, b, c = 1, 2, 3。但這次透過龍哥的 code,注意到重點不在於「有幾個變數,後面就要有幾個值」,如果有個 array = [1, 2, 3],那在變數賦值上,可以寫成 a, b, c = array,意思就是「前面有幾個變數,後面要有幾個值,但任何形式都可以」
  2. 在 Class 中使用 attr_reader 比起實體變數的好處:每看到龍哥的 code,發現在透過 attr_reader 後,接下來任何方法需要用到 width, length, height 時,不再使用 @ 的實體變數,讓我好奇這樣會有什麼差異,看了幾篇文章,幫自己整理大部分人提到的主要原因:

【主因】使用 attr_reader 方法比起直接用 實體變數 好抓錯

# ===用實體變數拼錯字時會出現===

Failure/Error: (@widt * length + length * height + width * height) * 2
     NoMethodError: undefined method `*' for nil:NilClass

# ===用 attr_reader 方法拼錯字時會出現===

Failure/Error: (widt * length + length * height + width * height) * 2
     
     NameError: undefined local variable or method `widt' for #<Block:0x00007f9d2d4106c8 @width=2, @length=2, @height=2>
       Did you mean?  width
                      @width

【小結】很明顯看得出來,運用 attr_reader 的方法噴錯時,ruby 會很明確地告訴你那邊有問題,甚至提示你可能的正確寫法。用實體變數則只告訴你 nil,但我們還是不知道問題錯在哪


題目:

# 實作以下內容

class Block
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "實作內容" do
    cube = Block.new([2,2,2])

    expect(cube.width).to be 2
    expect(cube.length).to be 2
    expect(cube.height).to be 2
    expect(cube.volume).to be 8
    expect(cube.surface_area).to be 24
  end
end

我的答案

class Block
  def initialize(array)
    @array = array
  end

  def width
    @array[0]
  end
  def length
    @array[1]
  end
  def height
    @array[2]
  end
  def volume
    @array.reduce(1) { |start, i| start * i }
  end
  def surface_area
    @array[0] * @array[1] * 6
  end
end

思路:

  1. 一樣先處理初始化的 method
  2. 針對答案需要的用 array index 取出來計算
  3. 體積的計算,想說可以練習 reduce 的用法

龍哥建議的答案

class Block
  attr_reader :width, :length, :height
  def initialize(array)
    @width, @length, @height = array
  end

  def volume
    width * length * height
  end

  def surface_area
    (width * length + length * height + width * height) * 2
  end
end

上一篇
Codewars Ruby Challenge - Day 19/30
下一篇
Codewars Ruby Challenge - Day 21/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言