iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 21

Codewars Ruby Challenge - Day 21/30

學習

  1. 使用 attr_reader 與有明確命名的取捨:當在處理 rspec 的最後一條 jill.name,有想到可以使用 attr_reader,但這表示方法名稱與回傳的實體變數得一樣,這樣 initialize 時就只能取名為 name,不能是比較有區分性的 my_name。以這題來說龍哥考量的應該是「精簡的程式碼行數」對他來說 name 與 your_name 還是有區隔;對我來講,用 my_name 與 your_name 才有區隔,所以我偏向「明確命名」而不使用 attr_reader
  2. 該往 Codewars 更高級走了:開始發現刷 7、8 級的題目上沒有什麼問題,表示成長幅度下降了,明天再刷一題確認一下,準備往上爬~

題目:

# 調整以下實作,讓程式可順利執行

def greet(my_name, your_name)
  "Hello #{your_name}, my name is #{my_name}"
end

答案需要過以下測試:

RSpec.describe do
  it "打招呼!" do
    jack = Human.new("Jack")
    jill = Human.new("Jill")

    expect(jack.greet("Jill")).to eq "Hello Jill, my name is Jack"
    expect(jack.greet("Mary")).to eq "Hello Mary, my name is Jack"
    expect(jill.greet("Jack")).to eq "Hello Jack, my name is Jill"
    expect(jill.name).to eq 'Jill'
  end
end

我的答案

class Human
  def initialize(my_name)
    @my_name = my_name
  end

  def greet(your_name)
    "Hello #{your_name}, my name is #{@my_name}"
  end
  
  def name
    @my_name
  end
end

思路:

  1. 需要先新增名為 Human 的 class,與初始化 initialize
  2. 改寫原本給的類別方法 greet
  3. 新增類別方法 name

龍哥建議的答案

class Human
  attr_reader :name
  def initialize(name)
    @name = name
  end

  def greet(your_name)
    "Hello #{your_name}, my name is #{@name}"
  end
end

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

尚未有邦友留言

立即登入留言