Ruby

2018-02-24 15:18 更新

X分鐘速成Y

其中 Y=ruby

源代碼下載:?learnruby-zh.rb

# 這是單行注釋

=begin
這是多行注釋
沒(méi)人用這個(gè)
你也不該用
=end

# 首先,也是最重要的,所有東西都是對(duì)象

# 數(shù)字是對(duì)象

3.class #=> Fixnum

3.to_s #=> "3"

# 一些基本的算術(shù)符號(hào)
1 + 1 #=> 2
8 - 1 #=> 7
10 * 2 #=> 20
35 / 5 #=> 7

# 算術(shù)符號(hào)只是語(yǔ)法糖而已
# 實(shí)際上是調(diào)用對(duì)象的方法
1.+(3) #=> 4
10.* 5 #=> 50 

# 特殊的值也是對(duì)象
nil # 空
true # 真
false # 假

nil.class #=> NilClass
true.class #=> TrueClass
false.class #=> FalseClass

# 相等運(yùn)算符
1 == 1 #=> true
2 == 1 #=> false

# 不等運(yùn)算符
1 != 1 #=> false
2 != 1 #=> true
!true  #=> false
!false #=> true

# 除了false自己,nil是唯一的值為false的對(duì)象 

!nil   #=> true
!false #=> true
!0     #=> false

# 更多比較
1 < 10 #=> true
1 > 10 #=> false
2 <= 2 #=> true
2 >= 2 #=> true

# 字符串是對(duì)象

'I am a string'.class #=> String
"I am a string too".class #=> String

placeholder = "use string interpolation"
"I can #{placeholder} when using double quoted strings"
#=> "I can use string interpolation when using double quoted strings"

# 輸出值
puts "I'm printing!"

# 變量
x = 25 #=> 25
x #=> 25

# 注意賦值語(yǔ)句返回了賦的值
# 這意味著你可以用多重賦值語(yǔ)句

x = y = 10 #=> 10
x #=> 10
y #=> 10

# 按照慣例,用 snake_case 作為變量名
snake_case = true

# 使用具有描述性的運(yùn)算符
path_to_project_root = '/good/name/'
path = '/bad/name/'

# 符號(hào)(Symbols,也是對(duì)象)
# 符號(hào)是不可變的,內(nèi)部用整數(shù)類(lèi)型表示的可重用的值。
# 通常用它代替字符串來(lái)有效地表示有意義的值。

:pending.class #=> Symbol

status = :pending

status == :pending #=> true

status == 'pending' #=> false

status == :approved #=> false

# 數(shù)組

# 這是一個(gè)數(shù)組
array = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]

# 數(shù)組可以包含不同類(lèi)型的元素

[1, "hello", false] #=> [1, "hello", false]

# 數(shù)組可以被索引
# 從前面開(kāi)始
array[0] #=> 1
array[12] #=> nil

# 像運(yùn)算符一樣,[var]形式的訪問(wèn)
# 也就是一個(gè)語(yǔ)法糖
# 實(shí)際上是調(diào)用對(duì)象的[] 方法
array.[] 0 #=> 1
array.[] 12 #=> nil

# 從尾部開(kāi)始
array[-1] #=> 5

# 同時(shí)指定開(kāi)始的位置和長(zhǎng)度
array[2, 3] #=> [3, 4, 5]

# 或者指定一個(gè)范圍
array[1..3] #=> [2, 3, 4]

# 像這樣往數(shù)組增加一個(gè)元素
array << 6 #=> [1, 2, 3, 4, 5, 6]

# 哈希表是Ruby的鍵值對(duì)的基本數(shù)據(jù)結(jié)構(gòu)
# 哈希表由大括號(hào)定義
hash = {'color' => 'green', 'number' => 5}

hash.keys #=> ['color', 'number']

# 哈希表可以通過(guò)鍵快速地查詢(xún)
hash['color'] #=> 'green'
hash['number'] #=> 5

# 查詢(xún)一個(gè)不存在地鍵將會(huì)返回nil
hash['nothing here'] #=> nil

# 用 #each 方法來(lái)枚舉哈希表:
hash.each do |k, v|
  puts "#{k} is #{v}"
end

# 從Ruby 1.9開(kāi)始, 用符號(hào)作為鍵的時(shí)候有特別的記號(hào)表示:

new_hash = { defcon: 3, action: true}

new_hash.keys #=> [:defcon, :action]

# 小貼士:數(shù)組和哈希表都是可枚舉的
# 它們可以共享一些有用的方法,比如each, map, count 等等

# 控制流

if true
  "if statement"
elsif false
 "else if, optional"
else
 "else, also optional"
end

for counter in 1..5
  puts "iteration #{counter}"
end
#=> iteration 1
#=> iteration 2
#=> iteration 3
#=> iteration 4
#=> iteration 5

# 然而
# 沒(méi)人用for循環(huán)
#  用`each`來(lái)代替,就像這樣

(1..5).each do |counter|
  puts "iteration #{counter}"
end
#=> iteration 1
#=> iteration 2
#=> iteration 3
#=> iteration 4
#=> iteration 5

counter = 1
while counter <= 5 do
  puts "iteration #{counter}"
  counter += 1
end
#=> iteration 1
#=> iteration 2
#=> iteration 3
#=> iteration 4
#=> iteration 5

grade = 'B'

case grade
when 'A'
  puts "Way to go kiddo"
when 'B'
  puts "Better luck next time"
when 'C'
  puts "You can do better"
when 'D'
  puts "Scraping through"
when 'F'
  puts "You failed!"
else 
  puts "Alternative grading system, eh?"
end

# 函數(shù)

def double(x)
  x * 2
end

# 函數(shù) (以及所有的方法塊) 隱式地返回了最后語(yǔ)句的值
double(2) #=> 4

# 當(dāng)不存在歧義的時(shí)候括號(hào)是可有可無(wú)的
double 3 #=> 6

double double 3 #=> 12

def sum(x,y)
  x + y
end

# 方法的參數(shù)通過(guò)逗號(hào)分隔
sum 3, 4 #=> 7

sum sum(3,4), 5 #=> 12

# yield
# 所有的方法都有一個(gè)隱式的塊參數(shù)
# 可以用yield參數(shù)調(diào)用

def surround
  puts "{"
  yield
  puts "}"
end

surround { puts 'hello world' }

# {
# hello world
# }

# 用class關(guān)鍵字定義一個(gè)類(lèi)
class Human

     # 一個(gè)類(lèi)變量,它被這個(gè)類(lèi)地所有實(shí)例變量共享
    @@species = "H. sapiens"

    # 構(gòu)造函數(shù)
    def initialize(name, age=0)
        # 將參數(shù)name的值賦給實(shí)例變量@name
        @name = name
        # 如果沒(méi)有給出age, 那么會(huì)采用參數(shù)列表中地默認(rèn)地值
        @age = age
    end

    # 基本的 setter 方法
    def name=(name)
        @name = name
    end

    # 基本地 getter 方法
    def name
        @name
    end

    # 一個(gè)類(lèi)方法以self.開(kāi)頭
    # 它可以被類(lèi)調(diào)用,但不能被類(lèi)的實(shí)例調(diào)用
    def self.say(msg)
       puts "#{msg}"
    end

    def species
        @@species
    end

end

# 類(lèi)的例子
jim = Human.new("Jim Halpert")

dwight = Human.new("Dwight K. Schrute")

# 讓我們來(lái)調(diào)用一些方法
jim.species #=> "H. sapiens"
jim.name #=> "Jim Halpert"
jim.name = "Jim Halpert II" #=> "Jim Halpert II"
jim.name #=> "Jim Halpert II"
dwight.species #=> "H. sapiens"
dwight.name #=> "Dwight K. Schrute"

# 調(diào)用對(duì)象的方法
Human.say("Hi") #=> "Hi"
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)