Ruby 趣學筆記(一)

Ruby 趣學筆記(一)

本文寫於 2020 年 5 月 6 日python

最近在 mac 上探索到了 homebrew 的使用方法,對 ruby 的興趣直線上升,因此來學一學。程序員

最近幾年確實你們一直在唱衰 Ruby,整個社區的生態確實也不如 python 那麼龐大,可是這都不妨礙 ruby 被稱做「快樂編程」。web

這幾年愈來愈強調語言的性能,可是 Ruby 的做者松本行弘卻認爲,人才是最重要的!編程

自看到第一眼後,我就深覺得同!數組

這其實就是一個價值觀的問題,人更值錢,那麼就應該儘可能節省人力;機器算力更值錢,那麼就應該用人力去優化程序,來節省機器的算力。ruby

可是國內的大環境你們也懂,人多爆了。數據結構

那麼天然而然,從上面的結論來看,Ruby 在國內就不會流行——iphone

Ruby 做爲多範式編程語言,真的很難協做;做爲解釋型語言,運行速度也是超級慢……編程語言

可不少人對於 Ruby 的評價仍然是:程序員的一把尖刀!函數

而且在 web 開發領域,不少大公司堅持在使用 Ruby,這足以說明 Ruby 的強大了!

函數

def sayHelo
    puts "Helo World."
end

sayHelo

就這麼簡單,看起來還蠻像 python 的。可是咱們繼續深刻,就會發現,ruby 的語言真的使人溫馨

傳參的函數

def sayHello(name)
  puts "Hello, #{name}."
end

咱們還能夠提供一個默認值,就像這樣:

def sayHello(name = 'world')
  puts "Hello, #{name}."
end

這樣,若是咱們不傳入參數,那麼就會自動將 world 賦給 name 變量。

class

Ruby 是一個純 OOP 語言,那麼天然開頭就要講 class 啦!

讓咱們來定義一個手機類:

class Phone
  def initialize(brand = '蘋果', name = '劉好', number = 15_527_782_945)
    @brand = brand
    @name = name
    @number = number
  end

  def call
    puts "#{@name}使用#{@brand}手機,撥打了#{@number}的號碼。"
  end
end

iphone = Phone.new

iphone2 = Phone.new('三星', '王自如', 1123321)

你們從這裏就能看到,Ruby 的語言是多麼的像英語。

在這個類中咱們能夠看到有個@variable,這個有什麼用呢?其實就是一種變量。

  • 局部變量:局部變量是在方法中定義的變量,在方法外是不可用的,而且習慣以以小寫字母或_開始(只是習慣);
  • 實例變量:實例變量能夠跨任何特定的實例或對象中的方法使用,這意味着,實例變量能夠從對象到對象的改變,要想定義它,須要以前放置符號@(這是語法,不是習慣!);
  • 類變量:類變量能夠跨不一樣的對象使用,它屬於類,且是類的一個屬性,要想定義它,須要在變量名以前放置符號@@
  • 全局變量:類變量不能跨類使用。若是想要有一個能夠跨類使用的變量,您須要定義全局變量,它是以美圓符號$開始的。

那麼如何改變實例變量呢?

使用attr_accessor: 定義可存取對象的屬性。

class Game
    attr_accessor :price #, :name
    def initialize(name = "怪物獵人世界", price = 200)
        @name = name
        @price = price
    end
end

此時 price 變量就是能夠改變的,name 就不能夠改變。

能夠利用respond_to?來判斷一下(這個方法一下子會說):

mygame.respond_to?("name") # false
mygame.respond_to?("price") # true

class 下面有啥方法?

Phone.instance_methods(false)

這個方法,可讓咱們知道該類下,有什麼方法是咱們自定義的。

對於上面寫的Phone類,輸出結果就會是:

call

就這麼簡單。

若是中間寫的是true呢,則會顯示全部的方法,好比一些自帶的方法。

如何判斷這個方法是否存在呢?

iphone = Phone.new
iphone.respond_to?("call")

respond_to?這個方法能夠判斷該對象是否擁有某個方法,能夠返回一個布爾值。

因此咱們一般能夠這麼用:iphone.respond_to?("call") && iphone.call

變量類型

什麼???變量類型?

Ruby 不存在所謂的「基本類型」,好比int/float/char/...

一切皆對象的原則被嚴格恪守!

什麼意思呢?

puts 1.to_s

to_s天生的就是 1 的方法!

對於數據類型來講,Ruby 擁有:Number、String、Ranges、Symbols,以及 true、false 和 nil 這幾個特殊值,同時還有兩種重要的數據結構——Array 和 Hash。

Array

別的類型其實沒太多好說的,都大同小異。

咱們從 Array 類型的方法,來體驗一下 Ruby 的靈活性!

games = ['魔獸世界', '塞爾達傳說', '金庸羣俠傳']
puts games

這個 games 的定義,若是你在 RubyMine 或者其餘強大的 IDE 中編寫,他就會告訴你,有更好的方式:games = %w[魔獸世界 塞爾達傳說 金庸羣俠傳]

這就是爲何 Ruby 不易協做,一千個程序員有一千種寫法與實現方法!

數組的遍歷

這是永遠的重點,正常編程中最爲經常使用的方法。

Ruby 能夠經過each來遍歷數組,具體語法以下:

games.each do |game|
  puts "我喜歡#{game}"
end

這個地方稍微提一句,我曾在某個地方看到過,寫單引號的程序最後會比寫雙引號的小(文件大小)。

可是這裏這種模板字符串的寫法,必需要雙引號。

帶上數組下標的遍歷

games.each_with_index do |game, i|
  puts "第#{i}個遊戲是#{game}"
end

數組的鏈接

games.join(','),這個方法其實不少語言都有,能夠返回一個由逗號鏈接的、由數組每一個元素順序組成的字符串。

怎麼判斷該變量是不是數組

這個怎麼判斷呢???

很簡單,仍是運用respond_to?

怎麼用?

剛剛的each方法就能夠!

games.respond_to?('each') && puts '這是一個數組!'

字符串操做

剛剛的一些示例代碼,應該能夠看出來一些套路。

接下來總結一下:

  • +:字符鏈接
  • <<:字符帶入
  • *:字符循環
a = "helo";
b = "world";
puts a + " " + b;

# <<:字符帶入
a << b
puts a
puts b

# 這個其實至關於 a = a + b

# *:字符循環
a="A"
puts a*4
相關文章
相關標籤/搜索