使用Rails 需要掌握的ruby知识(一)

Ruby语言的知识点很多,不过对于Rails 开发者来说需要掌握的很少。本文主要内容来自于《ruby on rails tutoril》这本书,是对这本书学习后第四章的个人总结,内心非常感谢该书作者Michael Hartl,也非常感谢中文翻译安道老师🙏


字符串和方法

Rails控制台:Rails控制台是用来与Rails应用交互的命令行工具,它基于Ruby的交互程序(irb)开发,可以使用ruby语言的所有功能,本文的操作都是在Rails控制台中完成的。

字符串

对于web应用,字符串或许是最重要的数据结构,因为网页的内容就是从服务器发送给浏览器的字符串。(书中原话)

如图-1,使用双引号("")创建字符串;使用 + 拼接字符串;使用特殊句法 #{} 进行插值操作。

图-1

Ruby 也支持单引号创建字符串,大多数情况下这两种字符串效果是一样的,二者最重要的区别是:Ruby 不会对单引号字符串进行插值操作。

注释:Ruby中的注释以井号 # 开始,一直到行尾。

对象和消息传送

在Ruby中,一切皆对象,对象的作用:响应消息。一般来说,传给对象的消息是“方法”,也就是在这个对象上定义的函数。

>> "GongYangbo".length            #字符串响应length方法,返回字符串中包含的字符数量
=> 10
empty? 方法后面的❓是ruby的约定 ,说明返回的是布尔值;
布尔值可以和    &&(与)    ||(或)    !(非)  运算符结合到一起使用;
>>  nil.to_s        #一切皆对象,nil也是对象,响应to_s方法
=>  ""
>> puts "It's a palindrome!" if s == s.reverse       #简单的回文测试


数组和值域

数组是一组具有特定顺序的元素。Ruby中可以包含不同类型的数据。

split 方法
>>  "gong yang bo".split        #把字符串拆分成有三个元素的数组
=>  ["gong", "yang", "bo"]
默认情况下,split在空格处把字符串拆分成数组,不过也可以在几乎任何地方拆分:
>> "fooxbarxbazx".split('x')
=> ["foo", "bar", "baz"]

数组可以响应一系列方法
>> a
=> [42, 8, 17]
>> a.length            #数组中元素个数
=> 3
>> a.empty?          #数组是否为空
=> false
>> a.include?(42)#数组元素中是否包含42
=> true
>> a.sort                #排序
=> [8, 17, 42]
>> a.reverse          #元素对掉
=> [17, 8, 42]
>> a.shuffle          #打乱元素顺序,随机变化
=> [17, 42, 8]
>> a
=> [42, 8, 17]
上面的方法都没有修改 a 的值。如果要修改数组的值,要使用相应的“炸弹”(bang)方法(之所以这么叫是因为,这里的感叹号经常都读作“bang”):
>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]
使用push方法向数组中添加元素,或者使用等价的<<运算符:
>> a.push(6)                  # 把 6 加到数组末尾
=> [42, 8, 17, 6]
>> a << 7                    # 把 7 加到数组末尾
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"        # 串联操作
=> [42, 8, 17, 6, 7, "foo", "bar"]

join 方法:split方法可以把字符串拆分成数组,使用join方法可以把数组转化成字符串(相反的操作)(图-2)

图-2

值域(range)
Range是范围对象的类,定义的时候可以使用范围操作符“..”或者“...”,“..”生成的范围对象包括起点和终点,“...”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组成,任何有顺序,有规律的一组对象,都可以用Range对象来定义,如数字、字母、字符串、甚至时间。
#遍历2017-01-01至2017-02-28每一天,对象是Date
begin_date = Date.parse '2017-01-01'
end_date = Date.parse '2017-02-28'
r1=begin_date .. end_date
r1.each{|date| puts date}


块(block)

数组和值域可以响应的方法中有很多都可以跟着一个块(block)
>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
这段代码在值域(1..5)上调用each方法,然后又把{ |i| puts 2 * i }这个块传给each方法。|i|两边的竖线在 Ruby 中用来定义块变量。只有方法本身才知道如何处理后面跟着的块。这里,值域的each方法会处理后面的块,块中有一个局部变量i,each会把值域中的各个值传进块中,然后执行其中的代码。
花括号是表示块的一种方式,除此之外还有另一种方式:
>> (1..5).each do |i|
>>     puts 2 * i
>> end
2
4
6
8
10
=> 1..5

inject 方法
arr1 = []
arr2 = [1,2,3]
arr2.each do |i|
    arr1 << i + 1
end
p arr1
#=> [2, 3, 4]

使用inject:
arr = arr2.inject ([]) do |arr1, i|
    arr1 << i + 1
end
p arr
#=>[2,3,4]

map 方法
>> (1..5).map { |i| i**2 }          # ** 表示幂运算
=> [1, 4, 9, 16, 25]
>> %w[a b c]                              # %w 用于创建元素为字符串的数组
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
map方法返回的是在数组或值域中每个元素上执行块中代码后得到的结果。
map后面的块在块变量上调用一个方法,这种操作经常使用简写形式:
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]

生成随机8个字母组合:
>> ('a'..'z').to_a                    # 由全部英文字母组成的数组
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> ('a'..'z').to_a.shuffle            # 打乱数组
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q",
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"]
>> ('a'..'z').to_a.shuffle[0..7]      # 取出前 8 个元素
=> ["f", "w", "i", "a", "h", "p", "c", "x"]
>> ('a'..'z').to_a.shuffle[0..7].join  # 把取出的元素合并成字符串
=> "mznpybuj"


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 10,474评论 0 11
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,056评论 0 7
  • 我是做烘培蛋糕的,爱上他,是在工作中,现在还记得我们初次见面的场景,那是夏天,很热的夏天,进入裱花间,他靠在立式的...
    奈何桥下见阅读 298评论 0 1
  • 我的永无乡在天空之城,上面有一个大城堡城堡,外面有一个护城河,在保护我们的城堡,河面很宽,而且特别甜,喝了...
    薛义之Harry阅读 271评论 0 1