`
tangyuanjian
  • 浏览: 1732 次
  • 性别: 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章

    《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...

    MySQL技术内幕InnoDB存储引擎-读书笔记.pdf

    MySQL技术内幕InnoDB存储引擎-读书笔记.pdf

    一个后端技术栈分享平台,主要收集后端相关的技术文档、读书笔记、专题学习等。.zip

    标题中的“一个后端技术栈分享平台”表明这是一个专注于后端开发的学习资源集合,而“主要收集后端相关的技术文档、读书笔记、专题学习等”则揭示了这个平台包含的内容类型,涵盖了技术文档、个人阅读心得以及系统化...

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

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

    rabbitmq读书笔记

    【RabbitMQ读书笔记】 一、简介 RabbitMQ 是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,旨在提供可靠且灵活的消息传递服务。RabbitMQ 在当前的软件行业中被广泛使用...

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

    【kindleSplit】是一个自动化工具,专为Kindle用户设计,用于将Kindle阅读器中的读书笔记拆分成单独的条目。这个工具的核心功能是将原本整合在一起的笔记内容拆分成独立的记录,便于管理和进一步的整理。尤其适用于...

    Ruby on Rails心得

    陈刚撰写的《Ruby on Rails心得_V0.1》是一份非常宝贵的资料,旨在记录作者在学习Ruby on Rails过程中的所见所得,包括读书笔记、心得体会、自创教程及一些常见问题的解决方案。作者通过写作这种方式不仅加深了对...

    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

    python学习源码和开发应用技术

    - **《Python编程金典》读书笔记**:这是一份基于经典书籍的学习笔记,可以帮助读者更好地消化和吸收书中的知识要点。 - **PHP、Python、Ruby的(数据库、文件)比较(原创)**:通过对三种语言在处理数据库和文件操作...

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

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

Global site tag (gtag.js) - Google Analytics