The Ruby Style Guid

https://github.com/bbatsov/ruby-style-guide#the-ruby-style-guide

指令筆記

執行 Ruby 檔案(建議以.rb做副檔名

ruby file.rb

在執行 ruby 指令時,可以指定 -c 僅檢查語法但不執行程式,指定 -w 顯示額外警訊,由於 -c、-w 經常一起指定,所以有個 -cw 可以達到分別指定 -c、-w 的效果。例如:

ruby -cw file.rb

如果只是要測試一小段簡單的指令稿,不一定要寫 .rb 檔案,也不一定要進入 irb,可以在執行 ruby 指令時,於 -e 之後用單引號括住指令稿,多行程式碼時以分號區隔。例如:

ruby -e 'puts "Hello, world!"'

在終端機開啟ruby模式

irb

如果想知道更多選項,可以執行 ruby 時鍵入 --help 或 -h 顯示說明清單

Ruby Index

The Ruby ri tool is used to view the Ruby documentation off-line.
Open a command window and invoke ri followed by the name of Ruby class, module or method. ri will display documentation for you.

開啟 Ruby 說明文件供指令參考。

ri

e.g.

ri Array
ri Array.sort
ri Hash#each
ri Match::sqrt

在這裡可以搜尋符號相關的問題 http://symbolhound.com/

put, p 的分別

  1. p 方法可以完整的把型態跟結構印出來,例如 "Hello, Ruby" 字串以及 [1, 2, 3] 陣列,而 puts 則是把「內容物」印出來。
  2. p 方法是有回傳值的,但 puts 方法沒有。
  3. 事實上,你可以再加上 inspect 方法,像是 puts "Hello, Ruby".inspect 或 puts [1, 2, 3].inspect 做到類似 p 方法的效果,但依舊沒有回傳值。

變數(variable)與常數(Constant)

變數種類

在 Ruby 裡,依寫法及範圍的不同,變數大概有以下幾種:

種類 範例 預設值 說明
區域變數(local variable) name 沒有 非大寫字母開頭的名字
全域變數(global variable) $name nil 前面加了 $ 符號的變數
實體(例)變數 (instance variable) @name nil 可以在類別內傳遞給不同方法使用
類別變數 (class variable) @@name 沒有 前面加了 2 個 @ 符號的變數

用 case when 取代過多的 if elsif:

 age = 10

  case age
  when 0..3
    puts "Baby"
  when 4..10
    puts "Kids"
  when 11..17
    puts "Teenager"
  else
    puts "Adult"
  end

查詢字串開頭結尾:

 puts "Hello, Ruby".start_with?("H")  # => true
  puts "Hello, Ruby".start_with?("h")  # => false
  puts "Hello, Ruby".end_with?("y")    # => true

想把字串裡的某些字換成其它字?

使用 sub 或 gsub 方法,可換掉一個或全部符合條件的字串:

 puts "PHP is good, and I love PHP".sub(/PHP/, "Ruby")
  # sub 只會換掉最先遇到的那個字串
  # => 印出「Ruby is good, and I love PHP」

  puts "PHP is good, and I love PHP".gsub(/PHP/, "Ruby")
  # gsub 會換掉全部符合的字串
  # => 印出「Ruby is good, and I love Ruby」

陣列 Array

  • .sort 方法:按順序排列
  • map 方法會「對 list 這個陣列裡的每一個元素做某件事之後再收集成一個新的陣列」,所以也不需要另外再建立一個空的陣列。
    list = [1, 2, 3, 4, 5]
    p list.map { |i| i * 2 - 1 }    # [1, 3, 5, 7, 9]
    

e.g. 1加到100:

  total = 0

  (1..100).to_a.each do |i|
    total = total + i
  end

  puts total    # 得到 5050

用*星號創建陣列:

 total = 0

  [*1..100].each do |i|
    total = total + i
  end

  puts total    # 得到 5050
  • reduce 方法讓程式碼更精簡:

    puts [*1..100].reduce(0) { |total, i| total + i }
    

    這個 reduce 方法會把「裡面每個元素不斷的〝互動〞(在這個例子是相加),然後再把最後結果收集起來」。其實 reduce 方法只在意傳進去的 total 跟 i 這兩個之間的「互動」,以這個範例來說,它只在意「相加」這件事,所以如果想要再更精簡的話還可以這樣寫:

    puts [*1..100].reduce(:+)
    

    參考:http://lazybios.com/2015/11/once-understand-inject-reduce/

問題:請印出 1 ~ 100 數字中所有的單數

你可能會這樣寫:

result = []

  [*1..100].each do |i|
    result << i if i % 2 == 1
  end

  p result    # [1, 3, 5, ... 95, 97, 99]

「在迴圈外面定義某個變數,然後在迴圈裡面一直存取它」模式再度出現,在 Ruby 有個 select 方法,可以挑選出「符合條件」的元素,並收集成陣列:

p [*1..100].select { |i| i % 2 == 1 }
再配合數字物件內建檢查奇數、偶數的方法:

p [*1..100].select { |i| i.odd? }
再精簡一點:

p [*1..100].select(&:odd?)

search for the meaning of symbols(& : )

雜湊(Hash)

Hash 有兩種寫法,一種是「箭頭式」的寫法:

old_hash = {:title => "Ruby", :price => 350}
在 Ruby 1.9 版之後,加入了類似 JSON 格式的寫法:

new_hash = {title: "Ruby", price: 350 }
但不管是新式或是舊式的,其實本質上都是一樣的。

 old_hash = {:title => "Ruby", :price => 350}
  new_hash = {title: "Ruby", price: 350 }

  puts old_hash == new_hash      # => true

在這個 Hash 裡的 title 跟 price 稱之 key,而字串 "Ruby" 及數字 350 則稱之 value。

遇到不知道怎麼用的,去查它的 API 手冊最直接了。

Ruby API
Rails API

方法 (Method)

關於方法的冷知識

在 Ruby 裡定義一個方法的時候,Ruby 就會在它的 Symbol 列表上多記上一筆,以下面這個例子來說:

  def say_hello
    puts "how are you?"
  end

就會在 Ruby 空間產生一個名為 :say_hello 的 Symbol。要執行這個方法的的話,除了前面提到的方式,也可使用 send方法,把 :say_hello 這個 Symbol 當參數傳給它:

send(:say_hello) # => how are you?

參數預設值

在定義方法時,可幫參數加上預設值:

  def say_something(message = "something")
    "message: #{message}"
  end

  p say_something "hi"     # => message: hi
  p say_something          # => message: something

參數省略

 <%= link_to '刪除', user, method: :delete, data: { confirm: 'sure?' }, class:'btn' %>

除了常常省略小括號外,偶爾也會省略大括號。在 Ruby 中如果最後一個參數是 Hash,它的大括號是可以省略的。舉個例子來說:

如果你了解有什麼東西被省略的話,一開始的那段 link_to 的範例還原之後會變成:

  <%= link_to('刪除', user, {method: :delete, data: { confirm: 'sure?' }, class:'btn'}) %>

程式碼區塊(block)

Block 在 Ruby 或 Rails 裡大量的被使用,是非常常見且重要的語法,在前面介紹迴圈的時候,可能都寫過這樣的程式碼:

  5.times { puts "Hello, Ruby" }      # 這會印 5 次的 Hello Ruby

  friends = ["魯夫", "孫悟空", "黑崎一護", "旋渦嗚人"]
  friends.each do |friend|
    puts friend                       # 這會把陣列裡的元素一個一個印出來
  end

其中,那個大括號 { ... } 以及 do ... end,在 Ruby 稱之一個程式碼區塊(Block)

results matching ""

    No results matching ""