NoPoint ruby 初级入门知识

babyhai · 发布于 2016年11月02日 · 最后由 babyhai 回复于 2016年11月07日 · 1104 次阅读
211242

ruby 初级入门知识

单引号与双引号:

单引号不会自动解析特殊符号,会将单引号之间的所有内容打印出来,如:

P ‘ hello,\nruby\n!\n ’ 就会打印出: hello,\nruby\n!\n 。

而双引号 P “ hello,\nruby\n!\n ” 会打印出:

 Hello  

 Ruby 
      




puts "1+1=#{1+1}" 的效果也一样。

因此,需要原封不动的打印时用单引号,需要解析特殊符号时用双引号。




print 的结尾不会自动换行,如 print a,b 会显示 ab 。需自己加 \n 来换行。用在程序要显示出执行结果或消息时。


P 会将双引号一起显示出来,并且会自动换行。如 p l 会显示 l  用在想要观察执行中的程序运行情况时,是为写程序的人而设计的方法。

Pp 方法会更直观的显示结果。 pp 会把哈希分多行显示,而 p 会在一行显示。




Ruby 的库函数的使用:

如要使用 Math 模块里的函数,如 sin, sqrt 等,就要在最开始 include Math ,然后直接给对象用这些函数,如 puts sqrt(100) 等。

也可以不 Include ,而使用 puts Math.sqrt(100) 

两个文件互相调用对方的方法:

 aa.rb 调用 bb.rb 里定义的方法 fun1() ,必须在 aa.rb 的最前面 include bb ,然后直接使用 fun1() 即可。

总结:

Include 方法既可以引入标准库中的模块, include  模块名  ;也可以引入其它 rb 文件, include  文件名  

Ruby  C 的不同之处:





1 C语言 中的 if 语句没有 end ,而 ruby 有, ruby 中的形式为:

 if  条件  then  

 要执行的动作

 elsif  条件  then 

 要执行的动作 

else          

 要执行的动作 

end              

为了突出动作和简洁性,还可以写成:

要执行的动作  if  条件 【此时不用写 end 








  2 C语言 中的 while 语句也没有 end ,而 ruby 中的 while 语句有:


while 条件  do 

  要执行的动作

 end          








    3 循环: ruby  for 语句和 C 语言的 for 语句格式不同:

for  变量  in  起始值 .. 终止值    

 要执行的动作                  
  end                                

或者:

 for  变量  in  对象  

 动作                    
 end                
同时有 times 方法,用于循环次数确定时:


times{

  动作   
 }     




4 ruby 中有 unless 方法: 【与 If 语句作用正好相反, Unless 后的条件不成立时才执行后面的语句。】

 unless  条件  then 

语句                   
else                  
语句                    
 end               







 5 case 语句的格式:  case 语句经常用在数组或者哈希的 each 方法内部】

case  要比较的对象
 when   1  then      
 语句 1                           
when   2  then     
语句 2                  
else                         
语句 3                  
 end                       






 Ruby 迭代器: times, each 等。

Ruby 过滤器:

对全体数据进行某些特定的处理并输出的程序称为过滤器。比如 pp 方法( pretty print )就是对全体数据按一定规则排列后再输出。

Ruby 容器: (container)

像数组、哈希这种用来存放对象的对象,称为容器。

Ruby 取数组的 index 和哈希的 key 

  b = [a,b]  

a = {name => rose,…….} 

只能用 b[0]  a[name] 来得到该 index/ 键对应的值,而不能用 b[a]  a[rose] 

(哈希中的键相当于数组中默认的 index 。)

要想取数组的 index 和哈希的 key ,必须用数组对象的 index 方法和哈希对象的 key 方法: b.index('a')  a.key('rose') 。(返回 0  a 






  较好的例子:

一:打印出下面的字符串中所有含有 abc (不区分大小写)的字符串。

 str = [ 'a','b','addb','abcd','Abced'] 

  str.each{ |item|                           
  if /abc/i =~ item   # 用正则表达式来匹配 
   puts item                                  
  end                                             
 }                                               

结果: abcd  Abced                 





Ruby 全局变量 (  $ 开头 ) 

在整个 .rb 文件中都是唯一的,而且在一个 .rb 文件中引入了另一个 .rb 文件,同时这两个文件中都有一个相同名称的全局变量,就会把这两个全局变量看成一个全局变量,它们之间是会互相影响的。全局变量会使程序跟踪困难。因此,不提倡使用全局变量。

举例:

 test1.rb:

 $x = 1       
  x = 1         
  test2.rb
 $x = 0    
  x = 0     
  p $x   # 0
  p x    # 0  
  require test1 
  p $x   # 1   
  p x    # 0     





Ruby 命名规则:

采用长命名方式,不要用简称;

单词之间用下划线隔开;

如果某个方法返回的是真假,习惯上在方法名后加个?;





  Ruby 对象:

对象有两个属性: 对象的 ID  对象的值 

 1 )每个对象都有唯一的一个 ID 来标识,用 equal? 来判断两个对象是不是同一个对象,即对象 ID 是否相同。

 2 )用 == 或者 eql? 来判断对象的值是否相同,区别:

== 比较时自动会进行必要的变换,如  p 1.0 == 1 ,输出 true 

eql? 比较时会很严格, p 1.0.eql?1 ,输出 false 

Ruby 的条件判断:

除了 if 语句、 case 语句 之外,还有一种 unless 语句 

Ruby 中的  ===  符号:

若左边是数值或字符串,则相当于  == 
在正则表达式下,相当于  =~ 
在类的场合下,则是判断  ===  右边的对象是否是类的实例。






  Ruby 中的循环: —— 熟练使用 times/each/while 三种!

 1   times 方法: —— 重复处理固定次数, i 必须从 0 开始 

10.times {  

 puts hello
  }                
||
10.times do 
 puts hello
end
还可以写成:  i  0 开始】
10.times { [i] 
print "this is ",i,"\n" 
}                        





  2  for 语句: —— 可自由的定义起始值和终止值

第一种:

for  变量  in  起始值 .. 终止值
 动作
end
举例:
Sum = 0
for i in 10..20
 puts i 
  sum = sum+i   
end  
puts sum 






  第二种:  
for  变量  in  对象 
动作 
end 
举例:
 names = [a,b,c] 
 for i in names  
 puts i   
 end   





 3  while 语句 

while  条件  do  
语句  
end   



   4  until 语句: —— 条件不成立时执行,与 while 相反

 until  条件  do 
 语句  
 end   





 5  each 方法: ——  for 的第二种用法类似,但一般都用 each 方法

 对象 .each{[i]   } 

语句  
  }      
    
对象 .each do [i]  
  语句
 end 





 5  loop 方法: 

loop{  语句  } 

将一直循环下去,必须配合 break 指令




 Ruby 中的循环控制语句: 
1 break—— 停止动作,马上跳出整个循环

2 next—— 直接跳到下一次循环 
3 redo—— 以相同的条件重新进行这一次循环 





 Ruby 中的类方法:

接收者不是对象而是类。会产生一个该类的对象。例如:

a = Array.new 

file = File.open(test1)
 time = Time.new  
改变实例变量 —— 巧妙的方法名称 
|Class HelloWorld 

 ………..


 Def name    # 读实例变量, getter 方法

   Return @name                                     
  End                                                      
 Def  name=  (value)     # 写实例变量, setter 方法
 @name = value                                
 End                                                     
  End                                                     
  Bob.name    返回 Initialize 中默认的初始值 
 Bob.name= Tom    返回 Tom         




     看上去像是幅值语句,其实是在调用 name=() 这个方法。 

 attr_reader

 attr_writer

|attr_accessor 方法  




 如果实例变量很多时,每个变量都要定义上面的读和写变量的方法,很麻烦, ruby 提供了三个方法来自动产生等效的功能。

使用方法:

attr_reader :name     # 读实例变量, getter 方法 

  attr_writer :name    # 写实例变量, setter 方法

  attr_accessor :name   # 此一句就相当于上述 name 和 name= 读和写两个方法。

类方法的定义,除了使用 类名 . 方法名 之外,还有两种形式, self. 方法名  class <<  类名 。一般都用第一种,但应该认识其他两种。

常数 —— 大写字母开头,可直接访问,值不能改。

 在类内定义的常数,在类外访问时,用 类名::常数名 的形式访问。
  Class HelloWorld   

 Version = 1.0   
  .....   
  End   
  P  HelloWorld::Version  






  类变量 ——@@ 开头,小写字母。必须通过定义 类方法 来访问和修改值。 

self 在不同地方时的意义

1 在实例方法中, self 代表实际使用该方法的那个对象。 

2 在类中且在实例方法外, self 代表这个类



   扩充类

即在已经定义的类中新增方法,可以去类的定义部分增加代码,也可以在任意的地方新增代码。如果要对 ruby 的基础类新增方法,则只能在其他地方新增代码了。比如在 String 类中新增用来计算字符串中单词数量的方法 count_word 

class String  

  def count_word 

  ary = self.split( )  

 return ary.size  

  end  

 end  

 str = I am a girl  

 p str.count_word   #  

定义或重载运算符 —— 与定义方法类似,只不过方法名变为了运算符符号。

 Def   [ ] (i) 

 .  
 End  





 继承的本质

父类与子类不一定要是        的关系,一般将多个类的共同部分定义在父类中,在子类中定义各自不一样的地方。有时候父类一般是不会直接产生对象的,父类的存在可能只是提供多个子类的共同部分,便于管理和定义罢了。

例如 ruby 中所有类都是 Object 类的子类,其中定义了一些最最基本的熟悉和方法,但一般不会用 Object 类来产生对象。

 Public private protected 方法:

 默认为 public    
 public 可以在外部通过实例来调用。
  Initialize 恒为 private 
Private 的只能在内部使用,不能在类的外部用 对象 . 方法 的形式调用。  
  Protected 的方法也只能在内部使用,不能在类的外部直接调用,但是可以在同一个类中的其他方法中 
调用该 protected 的方法,这里的其他方法可以是 public 的。
 Duck Typing 




举例:

对于数组: a = [BO,FO,CO]  和哈希: s = {0=>BO,1=>FO,2=>CO} ,都可以用 a[1] 或者 s[1] 来取值,且都有 downcase 的方法。那么此时对于这两种数据类型,就可以用相同的方法来处理。如:

  def  fetch_and_downcase(x, index) 
  if xx =  x[index]   
 return xx .downcase   
    end   
 end    
 P fetch_and_downcase(a,1)  # fo  
  P fetch_and_downcase(s,1)  # fo   

这就是 ruby  Duck Typing 的特点。即对于不同的东西,只要能进行相同的操作,就可以统一处理,避免了对不同类型的对象都要写一遍相同的方法的麻烦。





模块的用法

1. 提供命名空间

比如有方法名相同、功能不同的两个方法,就可以分别写在两个模块中,再用 模块名 . 方法名 的形式调用方法。或者 include 该模块然后直接使用方法。如使用 Math 模块中的 sqrt 方法,可以用 Math.sqrt(2) ,也可以 include Math ,然后直接用 sqrt(2) 

 2.   Mix-in 方式在类内 include 模块

如果两个类有几个相同的方法,就可以把这几个方法抽象出来写在一个模块里,再在每个类中 include 这个模块。这种方式一般用在:

两个类具有相似的功能,但并不想归类于相同的类时;

这两个类已经是从某些类继承下来的, ruby 不允许一个类有多个父类,因此可以用这种方式。

 3.  将多个相关的类放在一起统一管理






数组的建立

 1  普通方法,即 str = [a,b]

 2 Array.new 的方法:

   A = Array.new   # [ ]  

  A = Array.new(5)   # [nil, nil, nil, nil, nil]    

   A = Array.new(5,0)  #[0,0,0,0,0]   

  这种方法适合于产生多个元素内容相同的数组。 |

3 %w 的方法:

    A = %w(a b c d e f g)  # [“a”, “b”, ….]  

   适合于产生字符数组

4  使用 to_a 将其它类型(如哈希)转换为数组

5  使用 split 将字符串切割成数组




数组的操作

  1 )可以通过 索引 来:

获取或改写一个: a[2]  a.at(n)  a.slice(n)

获取或改写从 n  m 多个: a[n..m]  a.slice(n..m) ,及 a[nm]

获取或改写从 n 开始的多个: a[n,len]  a.slice(n,len)

 n 后面插入若干个: a[n,0]=[x,y] 

跳着取值或改写多个: a.values_at(1,3,5)

等操作。

  2 )可以将数组看做集合,求 交集  &   并集  |   差集即相减、相加 等操作。

(注意相加与求并集的区别)

3 以堆栈和队列的方式操作数组

a = [a,b,c]

从前方插入和删除:

a.unshift(o)  

a.shift     

从后方插入和删除:

a.push(d)    a << d  

a.pop      

若只想取第一个或最后一个,而不希望删除数组中的该元素,用 a.first  a.last 

  4 )将两个数组连成一个

a = [1,2]   b = [3,4]

a.concat(b)  a.concat([3,4])    a 就变成了 [1,2,3,4]

a+b 则会返回新的数组, a 仍然是原来的 [1,2]
此贴已暂时被屏蔽!

以下几种情况的帖子可能会进入此节点:

  1. 标题/正文描述不清不楚;
  2. 无意义的发帖;
  3. 存在广告嫌疑;
  4. 招聘信息描述不清楚,未按照招聘节点的要求发帖,或职位信息不符合社区用户群需求;
  5. 新注册的帐号发布产品推广贴是不允许的哦,付出和回报是相等的,当然如果你的产品确实非常有意思,或是和 Ruby 有关的东西,是不会进入这个栏目的。
  6. 太过弱的提问会被直接转移到此节点,请在提问前多尝试,多搜索;
  7. 理论上,不允许发布 QQ 群、微信群之类讨论群。

如果你发现你的帖子到了此节点下面,请自我检查反省,并修改帖子内容。


招聘贴被转移到此节点原因

警告: 以后招聘贴不符合要求,直接移动到本节点,管理员不再回复,如认真阅读,继续新发同样格式的贴,将会被禁用账号!

  • 排版请按 Ruby China 的 Markdown 格式要求,具体请认真阅读: 排版指导,并参考 这篇招聘 的排版;
  • 招聘内容过少,缺少公司介绍,产品介绍,职位介绍,或待遇,工作地,联系方式等必要信息;
  • 重复发帖(一家公司每月限制只能发一次招聘);
  • 专业不对口(个别不对口,但有特点的,我们会放过);

如果你有时间,请阅读 招聘栏目详细说明


学会如何合理提问,请阅读:https://ruby-china.org/topics/24325

当你修改好以后,可以回帖 @huacnlee@Rei@lgn21st 任何一人,我们将会审核,通过以后才可恢复到其他节点。

注!多次发现广告嫌疑的帐号,将会被禁用帐号。

共收到 4 条回复
25844

感谢分享~~ 有时间了可以改进下格式。 这里支持 markdown 格式,加点标题?(用 # 或者 ## 或者 ###) 分隔下段落, 代码的部分看看用 code 包起来。

欢迎来到 ruby-china 社区~~

De6df3

排版,修正错误的代码

211242

好的

211242 babyhai 关闭了讨论 11月03日 10:40
211242 babyhai 重新开启了讨论 11月03日 10:40
211242 babyhai 关闭了讨论 12月09日 14:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册