欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ruby读书笔记

程序员文章站 2022-07-14 10:14:18
...
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_toruby读书笔记
            
    
    博客分类: ror 读书RubyNetbeansActiveRecordRails rder
    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 排序         ruby读书笔记
            
    
    博客分类: ror 读书RubyNetbeansActiveRecordRails 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_toruby读书笔记
            
    
    博客分类: ror 读书RubyNetbeansActiveRecordRails rder
End

一对多:
class Order < ActiveRecord::Base
has_many :line_items
End
Class LineItem < ActiveRecord::Base
Belongs_toruby读书笔记
            
    
    博客分类: ror 读书RubyNetbeansActiveRecordRails rder
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 #单数表名支持