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} 


。。。 

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文件格式不变,统一为标准编码。 
 
 
控制台中文参数正确,页面传递中文参数也没有问题。 

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) 标签库 

                      "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=>”£”,:separator=>”,”,:delimiter=>””) 
£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_to 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 排序          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_to rder 
End 

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

多对多: 
class Product < ActiveRecord::Base 
has_and_belongs_to_many :categories 
End 
Class Cateory
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 #单数表名支持 

你可能感兴趣的:(ruby,ruby,activerecord,netbeans,class,exception,string)