`
tangyuanjian
  • 浏览: 1698 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ruby读书笔记

    博客分类:
  • ror
阅读更多
Ruby读书笔记

1.不同的变量:
全局变量用美元符作为前缀 $;
而实例变量用 @ 开头;
类变量用 @@ 开头;
类名、模块名和常量应该用大写字母开头。
局部变量不可以在内部类和子类中访问。

2.区间范围:
1..5 表示1,2,3,4,5
1...5表示1,2,3,4

3.与JAVA相反的对象比较
== 比较对象的数值是否相等
eql? 比较对象的数值和类型是否相等
equal? 比较内存地址

4. NetBeans6 调整菜单栏字体大小
在NB6 快捷方式选目标加入 --fontsize 12

5.执行顺序
BEGIN 与 END 执行顺序相反, at_exit 比end 晚执行。

6. 按不同进制显示数字
"100".to_i(10);  #按10进制显示。
"100".to_i(2);   #按2进制显示。

7.类的get、set类型
attr_writer :duration 类似 set
attr_reader :duration 类似get
attr_reader :name, :gender, :age
attr_accessor :motherland 相当于attr_reader:motherland; attr_writer :motherland
att: 所定义的属性可读可写。

8. Ruby 脚本
ruby script/server            :启动服务器
ruby script/server webrick    :以webrick作为指定服务器

9.输出语句
puts会识别双引号""内的转义符,每打印一串信息,在结果后面自动换行。
print也会识别双引号""内的转义符,但每打印一串信息,不会在结果后面自动换行。
p则不会识别双引号""内的转义符,怎样的内容就怎样按原来的字符串输出,且在结果后自动换行。

10.取消方法
undef用来取消一个方法的定义,也可以使用Module#undef_method方法取消方法的定义。undef会取消方法名和方法定义之间的关系,即使超类中有同名方法,调用时也会引发异常。
而Module#remove_method方法只负责取消当前类中方法名和方法定义之间的关系,父类的同名方法仍可调用,这点差别非常重要。

11.返回参数
defined?用来判断表达式是否定义。若表达式尚未定义,则返回nil,若已经定义,则返回一个字符串描述该表达式的种类。
若yield调用可用,则返回真,具体返回值为字符串"yield"。它的作用同block_given?一样,可以判断能否以带块方式来调用某方法。
defined? super若super可被调用,则返回真, 具体返回值为字符串"super"。

12. %q 和 %Q
使用 %q 和 %Q 来生成字符串对象。%q 相当于单引号,%Q相当于双引号。
单引号原样输出,双引号参与运算。
puts %q/Spring quote/
puts %Q/Spring quote/
puts %q/ #{50*50} /
puts %Q/ #{50*50} /

Spring quote
Spring quote
#{50*50}
2500 
?a     查看a的ascII数值           
97.chr   查看a 的数值是好多  

13.异常处理
begin … rescue … ensure …end

rescue ZeroDivisionError => ex
puts "Error, divide zero"
ensure
puts "Finish the process!"

ensure 无论如何都执行,有点像java的finally , 那么这个异常对象会被复制到ex中。

raise 抛出异常
throw  :exception1  catch :exception1

14.时间格式化输出
Time.now.strftime(“%Y-%m-%d %H:%M:%S”);

15.变长参数
*num 方法后面加上这个符号,表示参数不定 。

def varadd(*num)
sum = 0
num.each { |i| sum+=i }
puts sum
end

varadd()
varadd(1,2,3)
varadd(1,2,3,4,5,6)

16. IO操作

模式 含义
R 只读,从文件头开始(默认模式)
R+ 读写,从文件头开始
W 只写,文件不存在则创建文件,文件存在则清空内容
W+ 读写,文件不存在则创建文件,文件存在则清空内容
A 只写,文件不存在则创建文件,文件存在则在尾部添加
A+ 读写,文件不存在则创建文件,文件存在则在尾部添加
B (只用于DOS/Windows)二进制文件,可以和上述模式一同出现

17.Hash、each的用法
h.each {|key, value| puts "#{key} is #{value}" }

countries = ["Korea", "Japan", "China", "Brazil"] 
countries.each do |country|
  puts "My country is " + country
end

puts "----Sort the array before iteration"
countries.sort.each do |country|            #默认升序
  puts "My country is " + country
end

puts "----Sort it in reverse order before iteration"
countries.sort.reverse.each do |country|
  puts "My country is " + country
end

18. 将字符串变为常量
puts   "Koala".intern.class        
puts   'cat'.to_sym.class    
puts "----Usage of strings consumes lots of memory because there are 10000 Q1 strings"
10000.times do |x|
  x = { "Q1"=>"a", "Q2"=>"b", "Q3"=>"c", "Q4"=>"d"}
end

puts "----Usage of symbols consumes less memory because there is only one :Q1 symbol"
10000.times do |y|
  y = { :Q1=>"a", :Q2=>"b", :Q3=>"c", :Q4=>"d"}
end

19. 不同变量的表示方法
puts “#{name1},#{@name2}”

20.文件读写
复制input.txt到output.txt,并显示output.txt文件。
infile = File.new("input.txt", "r")
outfile = File.new("output.txt", "w")

puts "----Read input.txt file and write it to output.txt file"
infile.each do
  |i|
  outfile.write i
end

outfile.close()
infile.close()

puts "----Display output.txt file"
outfile = File.new("output.txt", "r")
outfile.each do
  |i|
  puts i
end

21.Object查找有没有name方法
puts Object.respond_to?(:name)  

22.instance_of? Kind_of?的区别
class A
end

class B < A
end

a = A.new
b = B.new

puts "----Exercise instance_of? and kind_of? methods among object instances"
puts a.instance_of?(A)
puts b.instance_of?(A)  =>false
puts b.kind_of?(A)      =>true

23. 定义缺省参数。
class MyOwnRubyMetaClass
  def method_missing(m) 
    puts "#{m} method has "+m.to_s.length.to_s+" characters."   
  end  
end

my_instance=MyOwnRubyMetaClass.new
my_instance.method1
my_instance.whatever
my_instance.m545

method1 method has 7 characters.
whatever method has 8 characters.
m545 method has 4 characters.
24. 两种each的显示:
puts "----First format of code block containing code fragment between { and }"
[1, 2, 3].each { |n| puts "Number #{n}" }

puts "----Second format of code block containing code fragment between do and end"
[1, 2, 3].each do |n|
  puts "Number #{n}"
end

25.split
split(/(\s+)/): 匹配1个或多个空格字符
split(/\b/):    还可以匹配标点符号

26.每次处理字符串的一个字符
‘foobar’.each_byte {|x| puts “#{x} = #{x.chr}”}
102 = f
111 = o
。。。
‘foobar’.scan(/./){|c| puts c}
f
o
。。。

27. 组合键
“\C-a” Ctrl+ a 的序列
“\M-a” Alt + a 的序列

28. Array 总结
1) #数组赋值的bug,第一种它始终指向一个对象,所以只能用block的方式
f = Array.new(3, "blah")
f[0].capitalize!    
puts f   # f is now: ["Blah", "Blah", "Blah"]  
g = Array.new(3) { "blah" }
g[0].capitalize!
puts g   # f is now: ["Blah", "blah", "blah"]  

2) 数组从0开始正排,负数从后面开始排。
3) 方法slice是[]方法的别名:
4) 方法nitems 也是返回数组的大小,不过他计算时不会包括nil的值:
y = [1, 2, nil, nil, 3, 4]
c = y.size                  # 6
d = y.length               # 6
e = y.nitems               # 4 

5) 对象数组的比较,其中可以多个属性。
list = list.sort_by {|x| [x.name, x.age, x.height] }

6) 等价表达
# detect == find  find_all==select   reject 与select 相反
x = [5, 8, 12, 9, 4, 30]  
#得到第一个偶数  
p x.detect {|e| e % 2 == 0 }          # 8 
p x.find {|e| e % 2 == 0 }            # 8 
p x.find_all {|e| e % 2 == 0 }        #[8, 12, 4, 30] p x.select{|e| e % 2 == 0 }          #[8, 12, 4, 30]  7) grep()查找字符串
a = %w[January February March April May]  
a.grep(/ary/)      # ["January, "February"]  
b = [1, 20, 5, 7, 13, 33, 15, 28]  
b.grep(12..24)     # [20, 13, 15] 

8) 数组的集合操作
| 或 & 与 –差
# array加入异或操作,自定义函数 ,覆盖Array方法。
class Array  
  def ^(other)  
    (self | other) - (self & other)  
  end  
 
end  
 
x = [1, 2, 3, 4, 5]  
y = [3, 4, 5, 6, 7]  
z = x ^ y        
p z  # [1, 2, 6, 7] 

include?或者member?
x = [1, 2, 3]  
if x.include? 2 
  puts "yes"     # Prints "yes" 
else 
  puts "no" 
end 

#数组的交叉,并去除嵌套
a = [1, 2, 3, 4]  
b = ["a", "b", "c", "d"]  
c = a.zip(b)  
p c
# c is now [[1,"a"], [2,"b"], [3,"c"], [4,"d"]]  
# Use flatten if you want to eliminate the nesting  
d = c.flatten 
p d
# d is now [1, "a", 2, "b", 3, "c", 4, "d"] 

9) collect  map
我们能够使用collect,方法来操作数组,她也就是和一般函数式语言里面的map函数一样,将会返回一个新的数组,正好ruby中也有map方法,它是collect方法的别名:

x = %w[alpha bravo charlie delta echo foxtrot]  
# Get the initial letters  
a = x.collect {|w| w[0..0]}        # 对每一个元素应用 [0..0] %w[a b c d e f]  
# Get the string lengths  
b = x.collect {|w| w.length}       # [5, 5, 7, 5, 4, 7]  
# map is just an alias  
c = x.map {|w| w.length}           # [5, 5, 7, 5, 4, 7] 

10) 数组的删除
compact :去除数组nil对象
pop   数组删除最后一个元素
shift  数组删除最前一个元素
uniq  去除重复元素。

29. linux下安装ruby
1)  从http://www.ruby-lang.org/ 下载ruby-1.8.4.tar.gz
2)  tar –zxf  ruby-1.8.4.tar.gz
转入ruby文件目录下运行
$ ./configure
$ make
$ make install
3) ruby –v 查看当前版本
4) 设置环境变量
$echo $PATH
$export PATH=$PATH:/usr/local/ruby/bin  不能保存

全局环境变量/etc/profile
本地环境变量/home/username/.bash_profile

30. ruby 对象关系


31. self.last 和self.end 与..和…没有关系

(1..10).end           #10
(1…10).end          #10

32.ruby gem包放置位置
D:\ruby\lib\ruby\gems\1.8\cache

33. File
File.statr 结果包含关于文件元数据的宝贵信息。
mtime: 写文件的最后时间
atime:  读文件的最后时间

‘w’: 写模式
‘a’ : 附加模式

要查找当前工作目录:
Dir.getwd

Rails读书笔记

1. 编码设置
UTF-8
1) netbeans 安装目录的etc目录下面修改
netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=1213058320593 -J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\"D:\Apache Tomcat 6.0.16\" -J-Dcom.sun.aas.installRoot=\"C:\Program Files\glassfish-v2ur2\" -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8"
2) netbeans工程项目选择UTF-8
3) environment.rb加入
ENV['NLS_LANG'] = "AMERICAN_AMERICA.UTF8"
4) application.rb加入
ActionController::Base.default_charset=("UTF-8")
  before_filter :configure_charsets
      def configure_charsets
          response.headers["Content-Type"] = "text/html; charset=UTF-8"
      end
5)所有rhtml页面的编码改为UTF-8,文件格式都要改成UTF-8,.rb的文件可以不改。
UTF-8情况下,控制台中国标准时间是乱码,而且处理传递中文参数乱码。

GBK
1) netbeans工程项目选择GBK
2) application.rb加入
$KCODE="GBK"
ActionController::Base.default_charset=("GBK")
before_filter :configure_charsets
      def configure_charsets
          response.headers["Content-Type"] = "text/html; charset=GBK"
      end
3) 所有ruby、rhtml文件格式不变,统一为标准编码。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<meta http-equiv="content-type" content="text/html;charset=GBK" />
控制台中文参数正确,页面传递中文参数也没有问题。

2. rails depot 项目总结
1)  缺省admin 的密码secret
2)  数据库迁移语法。
add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0
:precision   有效数字
:scale       小数点后位数
3) 校验
validates_presence_of :title, :description, :image_url #校验是否为空
validates_numericality_of :price #检验数字是否非法
validates_uniqueness_of :title   #检验标题是否唯一
validates_format_of :image_url,
                      :with    => %r{\.(gif|jpg|png)$}i,
                      :message => "must be a URL for a GIF, JPG, or PNG image"
  protected
  def validate
    errors.add(:price, "should be at least 0.01") if price.nil? ||  price < 0.01
  end
4) %{} 连接比较长的字符串
5) 标签库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6) CSS的套用
<%= stylesheet_link_tag "scaffold", "depot", :media => "all" %>
Js的应用
<%= javascript_include_tag 'allocationinfograph' %>
<%= javascript_include_tag :defaults%>

7) 交替使用颜色
<%= cycle('list-line-odd', 'list-line-even') %>

8)价钱显示方式,默认显示2位
<%= number_to_currency(product.price) %>
Number_to_currency(123456789.50,:unit=>”&pound;”,:separator=>”,”,:delimiter=>””)
&pound;123456789,50


9)激活session机制
config.action_controller.session_store = :active_record_store

10) 模型之间的关系
比如订单(order)和(line_items)是主从表关系
class Order < ActiveRecord::Base
    has_many :line_items
end

class LineItem < ActiveRecord::Base
    belongs_torder
    belongs_to :product
end

11)命名约定
变量名应该全部小写,单词之间以下划线分隔。
类和模块的名称下面没有下划线,首字母大写。

12) 2.1下脚手架的使用
ruby script/generate scaffold product  title:string description:text image_url:string

13)防注入SQL语句
name = params[:name]
pos = Order.find(:all,:conditions=>[“name=? and pay_type=’po’”,name]);

使用like
name = params[:name]
User.find(:all,:conditions=>[“name like ?”, name+”%”]);

:conditions 条件     :conditions=>[”name=?”,name]
:order 排序         rder=>”pay_type,ship desc”
:limit 条数          :limit=>10
:offset 偏移数量     :limit=>page_size,:offset=>page_num*page_size
:joins 表之间的关联  :joins=>”inner join products on …”
:select 字段         :select=>”title,speaker,recorded_on”
:readonly            :readonly=>true
:from                :from=>表名
:group               :group=>”sku” 


14) delete 和destory 的区别
Delete 绕过了ActionRecord的回调和验证
Destroy 确保调用这些功能。
最好使用后者。

15) 字符串连接方式
name1="中国"
name2="日本"
name3="韩国"
puts [name1,name2,name3].compact.join("")
puts name1+name2+name3
中国日本韩国 中国日本韩国  16) 用聚合来组织数据
Composed_of :name,
            :class_name =>Name,
:mapping=>
[
[:first_name :first],
[:initizls,  :initizls],
[:last_name, :last]
]

17) 当数据库出现写操作时,切记语句要有ID。

18) 一对一、一对多、多对多的分别写法
一对一:
class Order < ActiveRecord::Base
has_one :invoice
End
Class Invoice < ActiveRecord::Base
belongs_torder
End

一对多:
class Order < ActiveRecord::Base
has_many :line_items
End
Class LineItem < ActiveRecord::Base
Belongs_torder
End

多对多:
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
End
Class Cateory <ActiveRecord::Base
has_and_belongs_to_many :products
End

19)校验
validates_acceptance_of    检查checkbox是否被选中。
validates_associated       对关联对象进行校验。
validates_confirmation_of  校验一个字段及确认字段拥有相同的内容。
validates_each             在代码块中校验1个或多个属性值。
validates_exclusion_of     校验属性值不在一组值之中。
validates_format_of        校验属性值是否匹配1个正则表达式
validates_inclusion_of     校验指定的属性值是否出现在一组指定的数值中。
validates_length_of        校验属性值的长度。
validates_numericality_of  校验指定属性是合法的数值。
validates_presence_of      校验指定属性不为空。
validates_size_of          校验指定属性的长度
validates_uniqueness_of    校验属性的唯一性。   

20)save  成功返回true,失败返回nil。
save! 成功返回true,失败抛出异常。

begin
Order.save!
rescue RecordInvalid =>error
    # 处理
end

21)开发环境部署
1.安装rails2.1
2.安装数据库dbi
1)gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
2)然后再安装ruby和oracle的驱动:
gem install ruby-oci8 或者 ruby ruby-oci8-1.0.0-mswin32.rb
还需要把database.yml里面的adapter名字从oci改为oralce

22)rails扩展string操作
string =”Now is the time”

puts string.at(2)
puts string.from(8)
puts string.to(8)
puts string.first
puts string.first(3)
puts string.last
puts string.last(4)
puts string.starts_with?(“No”)
puts string.ends_with(“ME”)

puts Time.now.to_s(:db) 2008-05-12 09:30:00

23)对象数组的比较排序
list4.sort!{ |a,b| a.freq_start <=> b.freq_start }

24)配套JS收集
//合并单元格
function SpanGrid(tabObj,colIndex)
{
if(tabObj != null)
{
  var i,j;
  var intSpan;
  var strTemp;
  for(i = 0; i < tabObj.rows.length; i++)
  {
   intSpan = 1;
   strTemp = tabObj.rows[i].cells[colIndex].innerText;
   for(j = i + 1; j < tabObj.rows.length; j++)
   {
    if(strTemp == tabObj.rows[j].cells[colIndex].innerText)
    {
     intSpan++;
     tabObj.rows[i].cells[colIndex].rowSpan  = intSpan;
     tabObj.rows[j].cells[colIndex].style.display = "none";
    }
    else
    {
     break;
    }
   }
   i = j - 1;
  }
}
}
其中tabObj为table的id,colIndex是对与那一列。

25)js 传中文参数
1.页面传取用encodeURIComponent(中文)
2.页面读取用
require "iconv" 
system_name=  Iconv.conv("gbk", "utf-8", system_name) 进行转码
26) rails注释的写法
#  todo:    这里增加代码
#  optimize: 此函数需要优化
#  fixme:  需要修正
找出注释清单
rake notes
rake notes:todo

27)ActiveRecord::Base.pluralize_table_names = false #单数表名支持

1
0
分享到:
评论
1 楼 qiushily2030 2010-03-26  
Ruby语言。。。 什么情况用到的呢。

相关推荐

    Terry七月Ruby读书笔记(比较详细)第1/4页

    ¨ 解释执行:Python,Ruby,交互性很好; ¨ 编译执行:Pascal, C,速度较快。 n 本地执行,如C,C++; n 虚拟机执行,如Java, C#。   ¨ 动态语言,如JavaScript,Ruby; ¨ 静态语言,如C++,Java。   ...

    Programming Ruby(读书笔记)-3章

    NULL 博文链接:https://huihuilou.iteye.com/blog/1997808

    Ruby_on_Rails笔记

    此文档我学习Ruby on Rails技术的综合 ,有读书笔记、心得自创教程一些问题解决经验统分门别类集技术的综合 ,有读书笔记、心得自创教程一些问题解决经验统分门别类集技术的综合 ,有读书笔记、心得自创教程一些问题...

    Ruby On Rails开发从头来系列教程(chm)

    一边读着《Agile Web Development with Rails》的英文电子版,一边写随笔,并且尽量写的简单明了些,对于具体的细节概念倒没有做深入的研究,所以,这一系列也是《Agile Web Development with Rails》的读书笔记...

    kindleSplit:自动拆分kindle读书笔记为1条1条记录。后续考虑整理保存到数据库用web方式显示

    kindleSplit自动拆分kindle读书笔记为1条1条记录。并保存到印象笔记中。脚本在Mac下编写测试通过。执行方式ruby index.rb后续考虑web端,通过接口提交到web

    tuiblogs, 优秀的计算机编程类博客和文章共享出色的博客和网站.zip

    tuiblogs, 优秀的计算机编程类博客和文章共享出色的博客和网站 ##介绍使用发出以及请求请求优秀博客语言无关类语言相关类C/C++css/htmlDartJavaScript插件iOS插件pythonruby走。读书笔记及其它杨文博 ( 供职

    javaee笔试题-heyuan110.github.com.comments:heyuan110.github.com评论

    读书笔记及其它 语言无关类 操作系统 (简体) (中英文版) WEB服务器 (淘宝团队出品) 版本控制 NoSQL () MySQL 项目相关 (译言网) Web 编程艺术 【第一部分】 语言相关类 C/C++ () (宋劲杉, 北京亚嵌教育研究中心) (中...

    javaee笔试题-jenkins-demo:詹金斯演示

    读书笔记及其它 语言无关类 操作系统 (简体) (中英文版) WEB服务器 (淘宝团队出品) 版本控制 NoSQL () MySQL 项目相关 (译言网) Web 编程艺术 【第一部分】 语言相关类 C/C++ () (宋劲杉, 北京亚嵌教育研究中心) (中...

    echohn.github.io:我的博客

    2016/05/09: 「「提问的智慧」读书笔记 – 本来我是想放图片上来的,可是太大了……」 2016/04/30: 「How to run a script after network interface up – 顺便还有怎么不登录系统就能看到 ip 地址」 201

    2000个小程序精选源码(包含49个行业)

    │ │ 树芽读书.zip │ │ 物品回收.zip │ │ 股票分时图K线图小程序.zip │ │ 蜗牛生活服务.zip │ │ │ ├─社交交友(6个) │ │ gank.zip │ │ HIAApp.zip │ │ SmallAppForQQ-master.zip │ │...

Global site tag (gtag.js) - Google Analytics