🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

Day 1:Ruby on Rails 的学习资料与 Ruby 语言的基础知识

跟踪了时间才知道,每天的有效工作与学习时间平均只有 5 小时,我需要提高点效率,乱七八糟的事情少干。第一天花了 5 小时 58  分来准备学习资料与学习 Ruby 语言的基础知识。

音乐:http://music.163.com/#/song?id=36024457

学习资料

开始学习之前一般我会去找一些学习资料,我自己也订阅了一些国外的在线教育网站,比如 Lynda.com,Tutsplus 等等。找到适合自己频率的资料挺花时间的,特别是视频,有时候听有些人讲的东西老有骂娘的冲动,特别是当视频里关于铺垫的东西太多的时候,比如 “hey guys,I'm xxx,yesterday we were xxx , today we gonna xxx ... ”。

Lynda.com 的质量基本可以保证。Tutsplus 的课程差别很大,因为不是统一制作,也没有严格的标准,Youtube 上也会找到一些不错的视频,比如你遇到一个特别的问题,而不是想系统的学一样东西的时候,可以到 Youtube 上搜索一下。

找图书,我都是先到 Amazon.com 上搜索一下,找评价比较好的书,然后到 O'Reilly 的 Safari 上去找在线的版本,它里面有大量的技术书籍和视频,现在可以免费试用七天。

我经常会被学习资料湮没,看会儿视频,看不下去了就想再找本书看看,看了会儿书,又想看另外一本,因为我不确定到底哪本更适合我,哪本写的更好。这是最让我痛苦的,这个状态很难能真正学到东西。

Ruby On Rails 资料

官方

  1. Ruby on Rails 手册
    http://guides.rubyonrails.org/
  2. Ruby 语言文档
    https://www.ruby-lang.org/zh_cn/documentation/

图书

  1. 《Learning Rails 5: Rails from the Outside In》
    作者:Eric J Gruber, J. Mark Locklear
    https://www.safaribooksonline.com/library/view/learning-rails-5/97814919...
  2. 《Ruby on Rails Tutorial: Learn Web Development with Rails, Fourth Edition》
    作者:Michae Hartl
    https://www.safaribooksonline.com/library/view/ruby-on-rails/9780134597355/
  3. 《The Well-Grounded Rubyist, Second Edition》
    作者:David A. Black
    https://www.safaribooksonline.com/library/view/the-well-grounded-rubyist...

视频

  1. 《Ruby Essential Training》Kevin Skoglund
    作者:Kevin Skoglund,时长:6 小时 57 分
    https://www.lynda.com/Ruby-tutorials/essential-training/47905-2.html
  2. 《Ruby on Rails 5 New Features》
    作者:Kevin Skoglund,时长:1 小时 21 分
    https://www.lynda.com/Ruby-Rails-tutorials/Ruby-Rails-5-New-Features/482...
  3. 《Ruby on Rails 4 Essential Training》
    作者:Kevin Skoglund,时长:12 小时 41 分
    https://www.lynda.com/Ruby-Rails-tutorials/Ruby-Rails-4-Essential-Traini...

学习 Ruby 语言

《The Well-Grounded Rubyist, Second Edition》 by David A. Black,我看这本书的评价不错,现在是第二版,所以学习 Ruby 语言的任务就从它开始,昨天看了第一章,感觉挺好。

安装 Ruby

macOS 自带 Ruby,不过版本比较低,我用 Homebrew 下载安装了比较新的 Ruby 在自己的电脑上。

brew install ruby

重新启动一下终端,再检查一下 Ruby 的版本。

→ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

irb

全名是 The interactive Ruby console program,就是一个带交互功能的 Ruby 控制台,有点像浏览器开发者工具的控制台,输入代码,立即得到结果。irb 也是允许你输入 ruby 代码,然后可以立即看到结果。

irb

也可以使用简单的提示符:

irb --simple-prompt

2E6BF97B-EB8D-4C87-AAC6-096BAB266198

Ruby 基本的操作

在 irb 上做点算术:

>> 1 + 1
=> 2
>> 3 - 2
=> 1
>> 3 * 3
=> 9
>> 9 / 3
=> 3
>> 0.25 * 3
=> 0.75
>> 3 / 0.25
=> 12.0
>>

分配:

>> x = 1
=> 1
>> x
=> 1
>> string = 'hello'
=> "hello"
>> string
=> "hello"

比较:

>> x = 1
=> 1
>> y = 2
=> 2
>> x == y
=> false

转换:

>> x = '3.0'
=> "3.0"
>> x.to_i
=> 3
>> x = '3块钱'
=> "3块钱"
>> x.to_i
=> 3

Ruby 的输入与输出

输出东西用 print 或 puts,区别是 puts 在输出的东西的结尾自动会加上换行符。nil 是表示式返回的值,表示 nonobject 。

>> print 'hello'
hello=> nil
>> puts 'hello'
hello
=> nil
>> x = 'hello'
=> "hello"
>> puts x
hello
=> nil
>> print x
hello=> nil
>> p x
"hello"
=> "hello"

得到输入的东西,可以使用 gets 。

F2016BBF-A645-4BBC-9ADE-765BE4FD79CA

Ruby 里的特别的对象与注释

特别的对象:true,false,nil。true 与 false 经常是条件判断返回来的值,nil 表示 nonobject,表示值或者结果的缺席。

默认对象:self,程序运行的时候总是有一个 self 对象,至于 self 到底指的是谁是会有变化的。在调用方法的时候,如果不指定调用的对象的话,会使用 self 这个对象。

代码里的注释可以使用 # 号开头。

Ruby 修饰符

本地变量

可以使用小写字母,下划线,多个词的变量名可以使用下划线,这是 Ruby 的惯用方法。比如 firstName 是驼峰式写法,但 Ruby 会比较偏向使用下划线,像这样:first_name 。

实例变量

用在每个单独的对象里来存储信息,用 @ 符号开头,比如 @first_name,@ 后面的字符可以大写。

类变量

在每个类里存储信息,用两个 @ 符号开头,比如 @@first_name 。

全局变量

用 $ 符号开头,比如 $population。其它的部分可能跟本地变量的规则不太一样,比如有 $:,$1,$/,还有 $stdin,$LOAD_PATH 。只要是用 $ 开头的,都是全局变量。

(不算清醒了)上午10:54

常量

大写字母开头,A,String,FirstName,STDIN 都是合格的常量名字。Ruby 的惯例是使用全部的大写字母,多词的可以使用下划线分隔开。FIRST_NAME 。

关键词

Ruby 有一些保留的词。比如 def 是定义方法用的,class 是定义类用的,if 是条件,__FILE__ 当前执行的文件的名字,有 40 多个这样的词,一般都是很短的单个词。

方法名

方法名的命名跟本地变量的命名是一个规则(除了它们可以用 ?!= 结尾以外)。

方法调用

上午11:13 ***

从一个简单的单一值的整数或者字符串,到复杂点的数组,这些东西在 Ruby 看来都是对象。每个对象都会明白特定的信息,每个对象能明白的信息一般都会直接对应一个方法。方法就是一个有名字的能被对象触发执行的东西。

对象可以使用字面的形式表示,比如一个用引号标记的字符串。对象也经常会用变量来表示。

给对象发送消息用的是点操作符,点的右边是要发送的信息,它会发送给点左边的那个对象。比如 x = '100'.to_i,这里的 to_i 就是要发送的信息,它发送给了字符串 '100',字符串 '100' 被称为信息的接受者,它是一个对象。

有两种说法,一种是发送信息 to_i ,还有一种说明是调用方法 to_i。它们之间有点区别,就是发送给对象的信息一般会对应一个方法,但是也有可能没有这个方法。你可以在点的右边放任何的东西,但是不能保证你发送的信息会有一个对应的方法。

对象可以截获未知的信息,然后试着让它变得有意义。Ruby on Rails 就经常使用这样的方法,截获未知的信息然后做一些条件的判断,让它们变得有意义。

方法可以使用参数,参数也是对象。参数的周围可以使用括号包装,这个括号是可选的。

x = '100'.to_i(9) 为什么是 81 ?

bareword-style invocations 是啥意思? 比如 puts 'hello' ,意思是我们发送的消息是 puts ,带着参数 'hello' ,给一个默认的对象 self 。 程序运行的时候总是一个 self ,不过它表示的对象是会变的,根据特定的规则。

Class

下午1:38 ***

类定义了行为或者功能,每个对象都会是某个类的一个实例。我们可以定义自己的类,Ruby 也提供了大量内置的类,比如 String,Array,Fixnum。每次你创建一个字符串对象,其实就是创建了一个 String 类的实例。

虽然每个对象都有一个类,但是类并不是决定一个对象能做什么的唯一的因素。

写一个简单的程序

先准备一个项目:

cd ~/desktop
mkdir rails
cd rails
atom ./

创建一个文件,名字是:c2f.rb,代码如下:

celsius = 100
fahrenheit = (celsius * 9 / 5) + 32
print '结果是:'
print fahrenheit
puts '.'

然后在终端,执行一下:

ruby c2f.rb

上面的这个小程序可以把摄氏温度转成华氏温度。

键盘输入

修改程序的代码为:

print '请输入摄氏温度:'
celsius = gets
fahrenheit = (celsius.to_i * 9 / 5) + 32

print '华氏温度是:'
print fahrenheit
puts '.'

再执行一下这个 Ruby 程序,这次会等待你输入摄氏温度,根据你的输入,算出对应的华氏温度。

读取文件

新建一个文件,名字是 temp.dat ,在文件里输入 100,再修改一下程序代码:

puts '读取文件 ... '
num = File.read('temp.dat')
celsius = num.to_i
fahrenheit = (celsius * 9 / 5) + 32
puts 'the number is ' + num
print '结果是:'
puts fahrenheit

这个 Ruby 程序会读取 temp.dat 文件里的数据,根据里面的内容,计算出结果。

写文件

把转换的结果写入到一个文件里:

puts '请输入摄氏温度:'
celsius = gets.to_i
fahrenheit = (celsius * 9 / 5) + 32
puts '保存结果到了 temp.out 文件里'
fh = File.new('temp.out', 'w')
fh.puts fahrenheit
fh.close

Ruby 安装包含的东西

下午2:34 ***

→ irb --simple-prompt -r rbconfig
>> RbConfig::CONFIG['bindir']
=> "/usr/local/Cellar/ruby/2.3.1/bin"
>>

>> RbConfig::CONFIG['rubylibdir']
=> "/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0"
>> RbConfig::CONFIG['bindir']
=> "/usr/local/Cellar/ruby/2.3.1/bin"
>> RbConfig::CONFIG['archdir']
=> "/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/x86_64-darwin15"
>> RbConfig::CONFIG['sitedir']
=> "/usr/local/lib/ruby/site_ruby"
>> RbConfig::CONFIG['vendordir']
=> "/usr/local/lib/ruby/vendor_ruby"
>> RbConfig::CONFIG['sitelibdir']
=> "/usr/local/lib/ruby/site_ruby/2.3.0"
>> RbConfig::CONFIG['sitearchdir']
=> "/usr/local/lib/ruby/site_ruby/2.3.0/x86_64-darwin15"

Ruby 扩展与程序库

下午2:49 ***

Ruby 本身带了一些标准的库,比如数据库管理,网络,算术,XML 处理等等。把程序的代码分割成不同的文件,然后使用 require 或 load 加载它们,这两个关键词可以加载自带的扩展或自己写的扩展。

扩展有几种说法,比如 Feature,Extension,Library,Feature (特性或功能)一般会说 requiring a feature,library(库) 是经常用的,比较具体,它表示可以导入的东西。Extension(扩展) 一般指的是用 C 写的 Ruby 扩展。

load

先试一下 load,创建一个文件,名字是 loaddemo.rb,代码如下:

puts '第一个程序文件'
load 'loadee.rb'
puts '又是第一个程序文件'

再创建一个文件,名字是 loadee.rb,代码如下:

puts '> 来自第二个文件'

执行一下:

ruby loaddemo.rb

你会看到第二个文件里的内容也会出现在输出的结果里面,因为在第一个文件里,使用了 load 把它载入到了文件里。

你要载入的文件是在当前工作目录的下面,Ruby 会根据文件的名字找到它,如果不在,Ruby 会在 load path 里面查找它。这个 load path 可以这样得到:

→ ruby -e 'puts $:'
/usr/local/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib
/usr/local/lib/ruby/site_ruby/2.3.0
/usr/local/lib/ruby/site_ruby/2.3.0/x86_64-darwin15
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/vendor_ruby/2.3.0
/usr/local/lib/ruby/vendor_ruby/2.3.0/x86_64-darwin15
/usr/local/lib/ruby/vendor_ruby
/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0
/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/x86_64-darwin15

require

load 可以重复载入同一个文件,require 不能载入已经被 require 载入的文件,也就是同一个文件不能使用 require 重复的加载, Ruby 会跟踪已经载入的文件。

load 'loadee.rb'
require './loadee.rb'

require 是经常用的方法,用来加载 Ruby 扩展与库,标准的或其它的。你只需要 require 你想要的,完成以后,你就会有新的类与方法可以使用了。

这样试一下:

>> 'wang hao'.scanf('%s%s')
NoMethodError: undefined method `scanf' for "wang hao":String
Did you mean? scan
 from (irb):1
 from /usr/local/bin/irb:11:in `<main>'
>> require 'scanf'
=> true
>> 'wang hao'.scanf('%s%s')
=> ["wang", "hao"]

开始我打算使用 scanf,ruby 提示不懂,后来我用 require 加载了 scanf,再次尝试的时候,ruby 就懂我的意思了。

Ruby 工具

  • ruby —— 解释器
  • irb —— 带交互的 Ruby 解释器
  • rdoc 与 ri —— Ruby 文档工具
  • rake —— Ruby make,任务管理工具
  • gem —— Ruby 库与应用包管理工具
  • erb —— 模板系统
  • testrb —— 高级别工具,跟 Ruby 测试框架一块儿用

rake

这东西可以定义任务,这样试一下,新建一个文件,名字是 Rakefile,代码如下:

namespace :admin do
  desc '删除 /tmp 下面的所有文件'
  task :clean_tmp do
    Dir['/tmp/*'].each do |f|
      next unless File.file?(f)
      print "删除文件 ${f} ?"
      answer = $stdin.gets
      case answer
      when /^y/
        File.unlink(f)
      when /^q/
        break
      end
    end
  end
end

执行:

→ rake --tasks
rake admin:clean_tmp  # 删除 /tmp 下面的所有文件

上面就是定义了一个任务,可以删除掉 /tmp 目录下面的所有的文件。执行这个任务可以这样:

rake admin:clean

gem

gem 是 Ruby 的包管理工具,安装一个 gem:

gem install prawn

安装了 gem 以后,可以使用 require 方法导入使用它

require 'prawn'

 

Ruby

评论

我也是非常讨厌视频里说,“各位XX学院的同学们好,我是XX课程的主讲师,我叫XXX,上次视频我们讲了XX,这次我们XXX”

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点