跟踪了时间才知道,每天的有效工作与学习时间平均只有 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 资料
官方
- Ruby on Rails 手册
http://guides.rubyonrails.org/ - Ruby 语言文档
https://www.ruby-lang.org/zh_cn/documentation/
图书
- 《Learning Rails 5: Rails from the Outside In》
作者:Eric J Gruber, J. Mark Locklear
https://www.safaribooksonline.com/library/view/learning-rails-5/97814919... - 《Ruby on Rails Tutorial: Learn Web Development with Rails, Fourth Edition》
作者:Michae Hartl
https://www.safaribooksonline.com/library/view/ruby-on-rails/9780134597355/ - 《The Well-Grounded Rubyist, Second Edition》
作者:David A. Black
https://www.safaribooksonline.com/library/view/the-well-grounded-rubyist...
视频
- 《Ruby Essential Training》Kevin Skoglund
作者:Kevin Skoglund,时长:6 小时 57 分
https://www.lynda.com/Ruby-tutorials/essential-training/47905-2.html - 《Ruby on Rails 5 New Features》
作者:Kevin Skoglund,时长:1 小时 21 分
https://www.lynda.com/Ruby-Rails-tutorials/Ruby-Rails-5-New-Features/482... - 《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
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 。
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”
7 年 4 个月 以前