1.Proc
irb(main):001:0> a,b = [1,2,3], [4,5]
=> [[1, 2, 3], [4, 5]]
irb(main):002:0> aum = Proc.new {|total,x| total+x }
=> #<Proc:0x36d047@(irb):2>
irb(main):003:0> sum = a.inject(0, &aum)
=> 6
闭包是指未绑定到任何对象的自由代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。Ruby中的闭包实现有:Block,Proc,Lambada。Proc是函数化的block。Proc的作用是将Block函数化,提高Block的重复使用性。如例子所示在需要使用Block的时候使用&aum调用即可。
(1)Proc创建
irb(main):002:0> aum = Proc.new {|total,x| total+x }
(2)Proc调用
irb(main):026:0> aum = Proc.new {|total,x| total+x }
=> #<Proc:0x116318b@(irb):26>
irb(main):027:0> aum[1,2]
=> 3
irb(main):028:0> aum.arity
=> 2
其中的arity是Proc和Lambda特有的方法,判断Proc和Lambda期待的参数数目。
(3)Proc的相等性
Proc使用==判断两个Proc是否相等,并非使用同样的方法block就是相等的,只有clone或duplicate时==才返回true。
irb(main):029:0> aum = Proc.new {|total,x| total+x }
=> #<Proc:0x8c7be5@(irb):29>
irb(main):030:0> aum_1 = aum.clone
=> #<Proc:0x8c7be5@(irb):29>
irb(main):031:0> aum_1 == aum
=> true
irb(main):032:0> aum_1.object_id == aum.object_id
=> false
2.p,print,puts的区别:
p 不识别转义字符,完全打印
puts 识别转义字符,自动换行
print 识别转义字符,不自动换行
irb(main):023:0> p "hello,\n world","tom"
"hello,\n world"
"tom"
=> nil
irb(main):024:0> puts "hello,\n world","tom"
hello,
world
tom
=> nil
irb(main):025:0> print "hello,\n world","tom"
hello,
worldtom=> nil
irb(main):026:0>
3.数组
(1)数组元素的类型不是不变得;
(2)数组长度 length 或者size;
(3)使用%W(默认每个以空格隔开的元素以双引号包围) 和%w(以单引号包围) 可以表示字符串数组(ruby的版本不同而有所变化);
(4)数组引入了简易的数组拼接方法
---arr_a|arr_b:将两个数组中的所有元素合并,去除重复字符
---arr_a&arr_b:将两个数组中相同元素取出,并去除其中的重复字符
以上的数组方法并不会对元素进行排序处理
(5)对数组元素的排序
升序
irb(main):028:0> arr = [12,11,34,2,4,0]
=> [12, 11, 34, 2, 4, 0]
irb(main):029:0> arr.sort!
=> [0, 2, 4, 11, 12, 34]
降序
irb(main):030:0> arr.sort! {|x,y| y<=>x}
=> [34, 12, 11, 4, 2, 0]
4.Hash
ruby支持两种创建hash方式
irb(main):032:0> hash_1 = {"one" => 1, "two" => 2}
=> {"one"=>1, "two"=>2}
irb(main):033:0> hash_2 = {:one => 1}
=> {:one=>1}
后者比前者的效率高
此外,可以通过多种方式从数组生成hash
def p_hash_from_arr_method1(arr)
Hash[*arr]
end
def p_hash_from_arr_method2(arr)
Hash[*arr.flatten]
end
arr_4_method1 = %w[we are ch ha]
arr_4_method2 = [[1,"a"],[2,"b"]]
p p_hash_from_arr_method1(arr_4_method1), p_hash_from_arr_method2(arr_4_method2)
结果:
{"we"=>"are", "ch"=>"ha"}
{1=>"a", 2=>"b"}
但是在ruby1.9种似乎已经不支持从数组生成hash了,具体的调查ing。。。
5.序列
irb(main):038:0> range_1 = 1...4
=> 1...4
irb(main):039:0> num = 1.9
=> 1.9
irb(main):041:0> range_1.include? num
=> true
5.false
在条件判断中nil和false是不成立,其他的均为成立,但是nil和false并不是等价的
6.判断某个对象是否支持某个方法
irb(main):050:0> arr = Array.new
=> []
irb(main):051:0> arr.respond_to? :"sort!"
=> true
7.equal,==,object_id
equal用于比较两个对象是否是对同一个对象的引用,object_id具有同样功能。==是对两个对象的值的比较。
irb(main):001:0> arr = Array.new
=> []
irb(main):002:0> arr_1 = Array.new
=> []
irb(main):003:0> arr_2 = Array.new
=> []
irb(main):004:0> arr_3 = arr_1
=> []
irb(main):005:0> arr_1.equal?(arr_2)
=> false
irb(main):006:0> arr_1.equal?(arr_3)
=> true
irb(main):007:0> arr_1.object_id == arr_2.object_id
=> false
irb(main):008:0> arr_1.object_id == arr_3.object_id
=> true
8.修改常量的值
试图给常量赋值时,ruby发出警告,但是常量的值还是被修正。
irb(main):009:0> HEIGHT = 12
=> 12
irb(main):010:0> HEIGHT = 1
(irb):10 warning: already initialized constant HEIGHT
=> 1
irb(main):011:0> p HEIGHT
1
=> nil
irb(main):012:0>
9.赋值
左值和右值得数量不同:
1.左边的数量大于右边:最后的变量被赋值nil
2.左边的数量小于右边,右边多余的值不会付给任何变量
irb(main):001:0> a,b,c = 1,2
=> [1, 2]
irb(main):002:0> p a
1
=> nil
irb(main):003:0> p b
2
=> nil
irb(main):004:0> p c
nil
=> nil
irb(main):005:0> a,b = "a","b","c"
=> ["a", "b", "c"]
irb(main):006:0> p a
"a"
=> nil
irb(main):007:0> p b
"b"
=> nil
10.defined?
没有定义的返回nil
irb(main):003:0> arr = Array.new()
=> []
irb(main):004:0> defined? arr
=> "local-variable(in-block)"
irb(main):005:0> defined? a
=> nil
irb(main):006:0>
11.单例模式
irb(main):015:0> class Test
irb(main):016:1> include Singleton
irb(main):017:1> def say(val)
irb(main):018:2> p val
irb(main):019:2> end
irb(main):020:1> end
=> nil
irb(main):021:0> test = Test.instance()
=> #<Test:0xe555bd>
irb(main):022:0> test.say("tom")
"tom"
12.模块
module是不支持实例和子类继承的。可以通过以下方式来调用module方法:
(1)
irb(main):051:0> module MM
irb(main):052:1> def self.say
irb(main):053:2> p "hello"
irb(main):054:2> end
irb(main):055:1> end
=> nil
irb(main):056:0> MM.say
"hello"
=> nil
(2)
irb(main):001:0> module M
irb(main):002:1> def say
irb(main):003:2> p "hello"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> class ModuleTest
irb(main):007:1> include M
irb(main):008:1> end
=> ModuleTest
irb(main):009:0> moduletest = ModuleTest.new
=> #<ModuleTest:0x775121>
irb(main):010:0> moduletest.say
"hello"
=> nil
irb(main):011:0>
13.ruby重写和重载讨论
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同。
irb(main):025:0> class Shape
irb(main):026:1> def print_infor(width)
irb(main):027:2> p width
irb(main):028:2> end
irb(main):029:1> def print_infor(width,length)
irb(main):030:2> p width,length
irb(main):031:2> end
irb(main):032:1> end
=> nil
irb(main):033:0> shape.print_infor(1)
ArgumentError: wrong # of arguments(1 for 2)
from (irb):33:in `print_infor'
from (irb):33
irb(main):034:0> shape.print_infor(1,2)
1
2
=> nil
irb(main):035:0>
由此可见,ruby并不支持方法重载。
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同。
irb(main):035:0> class Circle<Shape
irb(main):036:1> def print_infor(width,length)
irb(main):037:2> p "width,length",width,length
irb(main):038:2> end
irb(main):039:1> end
=> nil
irb(main):040:0> circle = Circle.new(1,2)
=> #<Circle:0x1aa0e3b @width=1, @length=2>
irb(main):041:0> circle.print_infor(1,2)
"width,length"
1
2
=> nil
ruby支持重写。
分享到:
相关推荐
Ruby是一种纯粹的面向对象编程语言。它由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)创建于1993年。 您可以在 www.ruby-lang.org 的 Ruby 邮件列表上找到松本行弘(まつもとゆきひろ/Yukihiro ...
通过以上笔记,我们可以了解到Ruby元编程的一些基础概念和技术,包括语言构建、动态调用、符号与字符串的区别以及动态定义等。这些技术让Ruby成为一个非常灵活的语言,适合各种复杂场景下的开发需求。掌握这些基础...
在探索编程语言的海洋中,Ruby无疑是其中一颗璀璨的明珠。它的简洁优雅和强大的功能吸引了无数开发者投身于Ruby的怀抱。今天,让我们一起打开这份“Ruby笔记1”的神秘面纱,看看这位勇敢的航海者,在学习Ruby的旅途...
Ruby 是一种功能强大、灵活的编程语言,广泛应用于 Web 开发、脚本编写和系统管理等领域。下面是学习 Ruby 的一些实用建议:首先,了解 Ruby 的基本概念和语法。 Ruby 是一种面向对象的语言,具有简洁的语法和强大...
这个暑假回家没事干闲的蛋疼,正好手头有一本《七周七语言》,然后就开始从Ruby学起,到scala结束。中间的Io和prolog就被华丽丽的跳过了,因为prolog语法太奇葩,Io有没什么好的资料可以看,尽管我觉的Io应该会是一...
真正的面向对象编程语言 可扩展性强,且易于维护 丰富的语法糖,程序员友好 3、应用场景 网站开发 脚本编程 4、Ruby 注释 单行注释 # 注释 Ruby 单行注释 多行注释 =begin 这是多行注释 =end 5、Ruby 文件的构造与...
Ruby是一种纯粹的面向对象的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1993年创立。该语言的设计理念强调程序员的生产力和代码的可读性,并且支持多种编程范式,如函数式编程和元编程。 #### 二、Ruby的...
本资源“学习 Ruby 的笔记以及 Demo.zip”显然包含了关于Ruby编程的学习资料和一些实际示例代码,旨在帮助初学者理解并掌握Ruby的基础及进阶特性。 首先,让我们深入了解一下Ruby的核心特性: 1. 面向对象:Ruby是...
**Ruby** 是一种功能强大的、面向对象的、解释型的编程语言,由日本计算机科学家松本行弘(Yukihiro Matsumoto)于1995年开发。Ruby语言的设计哲学强调“简单优雅”,这体现在其语法设计上,它鼓励程序员编写易于...
RubyKickstart是学习Ruby编程语言的交互式指南。 此处的材料与一起跟随,但不必观看它们即可获得好处。 并获得带有注释和挑战的。 这个怎么运作 RubyKickstart作为一个充满文件和文件夹的文件夹下载到您的计算机上...
以上只是Ruby基础知识的一部分,实际上Ruby还支持块、 proc 和 lambda,模块(module)实现代码复用和类别(class)定义对象结构,以及强大的元编程能力,使得Ruby成为一个强大而灵活的开发工具。学习并熟练掌握这些...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法著称。"ruby笔记2ruby笔记2ruby笔记2"可能是指一系列关于Ruby学习的笔记,这些笔记可能涵盖了Ruby的基础概念、核心特性以及进阶话题。在Ruby的学习...
从给定的文件信息中,我们可以提炼出一系列关于Ruby编程语言的重要知识点,涵盖基础语法、变量类型、数值操作、条件语句、循环结构以及字符串处理等核心领域。 ### Ruby基础语法 #### 注释 Ruby提供了两种注释方式...
《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...
Ruby是一种纯面向对象的编程语言,拥有面向对象编程的三大特性:封装、继承和多态。类名在Ruby中必须以大写字母开始,象征着类名是常量。Ruby是一种基于行的语言,通常情况下,每遇到一个换行符就意味着一个语句的...
这是一个交互式的Web应用程序,支持Python、R以及其他多种编程语言,允许用户编写代码、执行单元格、显示输出,包括文本、图像、图表等。它是数据科学工作流中的重要工具,因为其可读性强,易于分享和协作。 `...
总的来说,`rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z`文件包含了一个在Windows上开始Ruby编程所需的基本组件和学习资源。通过安装Ruby和DevKit,你可以轻松地编写、编译和运行Ruby代码,同时结合学习...
Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称。在Ruby笔记3中,我们将会深入探讨这个强大的语言的各个方面,包括基础语法、类与对象、模块、方法、控制结构、异常处理、文件操作以及一些高级特性。 ...
参考手册是学习任何编程语言的重要工具,它能帮助你快速查找并理解特定的函数、方法或概念。Programming Ruby通常是指"The Pragmatic Programmer's Guide to Ruby",这是一本深入介绍Ruby编程的经典书籍,中文版可以...