没事做,写着玩的。不过ruby的block,proc,闭包或lambda还是有些复杂的,主要是以前在java里面没见过这些东西,一时还不能完全理解,就算勉强理解了,一时半会也很难熟练的运用。ruby里面有许多比较怪异的用法,包括API在内,并不能一目了然的让程序员明白其中的意思,因此要想用好这门语言,必须专门花些时间看看其每个API的用法,这是一个很让人郁闷的地方。而且也不一定能记住或理解,这个实践过程就比搞java要痛苦一点了。
ruby可以为参数设定默认值,这样调用方法时就可以省略此参数:
def prefix(s,len=1)
s[0,len]
end
p prefix("ruby")
p prefix("ruby",4)
也可以传递任意个参数,只需在参数前面加上*即可:
def max(first,*rest)
max=first
rest.each{|x| max=x if x>max}
max
end
data = [1,3,6,4]
p max(*data) #first=1,rest=[3,6,4] -> 6
代码块也是个比较有意思的东西,
def sequence(n,m,c)
i=0
while i<n
yield i*m+c
i+=1
end
end
sequence(5,2,2){|x| puts x}
这种语法也很特别,也没在其它语言里见过,通过yield来调用块里面的代码。
代码块是ruby的一种句法结构,它们不是对象,也不能像对象一样操作,不过可以创建对象来表示一个代码块。根据对象的创建方式,叫做proc或者lambda。proc的行为与代码块类似,而lambda的行为则与方法类似,不过,它们都是Proc类的实例。
用&做前缀的代码块参数把代码块和方法关联起来,如:
def makeproc(&p)
p
end
adder=makeproc{|x,y| x+y}
p adder.call(1,2)#3
也可以直接用Proc.new创建proc对象,上面的代码等价于
def makeproc
Proc.new
end
另一种创建Proc对象的方式是使用lambda方法,它是Kernel模块的一个方法,所以看不起来像是一个全局函数。就像名字所暗示的,lambda方法返回的Proc对象是一个lambda而非proc。lambda方法不带参数,但是在调用时必须关联一个代码块:
succ=lambda{|x| x+1}
p succ.call(4)
Proc还定义了数组访问操作符,它的工作方式与call一样,这意味可以用与方法调用类似的方式调用proc或lambda:
p succ[5]
p adder[2,3]
从这点说,ruby的确不是很正规,不过比较好玩。
ruby里面也有闭包这个特性,这个在jdk1.7才有可能实现的特性,在ruby中早就有了,闭包的主要特点是能记住其被定义的上下文,并在被调用时使用该上下文。proc与lambda都是闭包。
def multiplier(n)
lambda{|data| data.collect{|x| x*n}}
end
doubler = multiplier(2)
puts doubler.call([1,2,3]) #打印输出2,4,6
multiplier方法返回一个lambda,这个lambda在定义它的范围外被使用,我们称之为一个闭包,这个闭包封闭(或保持)了所绑定的方法参数n。
Proc定义了一个名为binding的方法,调用这个方法会返回一个Binding对象,它表示该闭包所使用的绑定。
闭包与绑定一起使用,大多数时候变得很简单,Binding对象本身并没有什么值得注意的方法,不过它可以作为全局函数eval的第二个参数,能为eval函数执行给定代码时提供一个上下文环境。在Ruby1.9中,Binding也自带了eval方法,你可能更愿意直接使用它。
使用Binding对象和eval方法可以让我们获得一个操控闭包行为的后门:
def multiplier(n)
lambda{|data| data.collect{|x| x*n}}
end
doubler = multiplier(2)
puts doubler.call([1,2,3]) #打印输出2,4,6
eval("n=3",doubler.binding)
puts doubler.call([1,2,3]) #打印3,6,9
一种更快捷的方式是直接使用eval方法:eval("n=3",doubler)。
分享到:
相关推荐
Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4
Ruby是一种动态、面向对象的编程语言,它具有简洁、易读的语法,被称为“程序员最好的朋友”。Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能...
语法所以,您可以定义一个简单的方法,如下所示:您可以定义一个接受参数的方法,如下所示:def method_name (var1, var2)您可以为参数设置默
方法求解器查找给定占位符的Ruby方法。 例如: solve { h = { a : 1 , bunny : 2 , c : 3 } h . ______ ( :bunny ) h . keys == [ :a , :c ]} 会发现#delete 请谨慎使用! 当心副作用。 求解器尝试使用接收器上找到...
风化Ruby 方法的 Haskell 风格部分应用和组合函数组合与部分应用程序结合使用时可以产生异常简洁的代码,通常比惯用的 Ruby 更简洁。 查看下面的链接,进一步解释这些特性以及它们在 Haskell 中的使用示例:此外,...
土耳其语支持 土耳其语支持核心Ruby方法。 这个gem提供了几乎所有String方法的支持,例如String#split , String#match , String#gsub 。 它还提供对Array#sort和一些奖励方法(如String#titleize 。要求Ruby> = ...
Ruby方法的模式匹配 安装 将此行添加到您的应用程序的Gemfile中: gem 'method_pattern' 然后执行: $ bundle 或将其自己安装为: $ gem install method_pattern 用法 扩展您希望能够与MethodPattern模块一起...
使用Pwned Passwords API的一种简单的Ruby方法。 | 目录 关于 Troy Hunt的允许您检查是否在任何重大数据泄露事件中找到密码。 Pwned是一个Ruby库,可以使用Pwned Passwords API的 Anonymity 针对API测试密码,而...
传递给 Ruby 方法的选项的稳健验证。 兼容性 BSON 针对 MRI (1.9.2+)、JRuby (1.7.0+)、Rubinius (2.0.0+) 进行了测试。 安装 使用 bundler,将optionable gem 添加到您的Gemfile 。 gem "optionable" , 在您的...
测量并确定Ruby方法的执行时间。 忘记了Time.now - t解决方案。 使用benchmark来查看执行您的方法需要多少时间。 样品或用法: 安装 将此行添加到您的应用程序的Gemfile中: gem 'benchmark_methods' 然后执行: ...
罗格通过近似类型签名的 Ruby 方法搜索引擎如何使用 $ git clone https://github.com/Azabuhs/Roogle.git $ cd Roogle $ cabal sandbox init $ cabal install --only-dependencies $ cabal build $ ./dist/build/...
show_code提供了一种在终端中显示您的ruby方法源代码的简便方法。 注意:show_code当前版本需要Ruby v1.9.0或更高版本。 安装 # Installing as Ruby gem $ gem install show_code # Or in gemfile $ gem show_code ...
作者Avdi Grimm主张Ruby方法应该像故事一样易于阅读。他将Ruby方法分成输入处理(Collecting Input)、功能实现(Performing Work)、输出 处理(Delivering Output)、失败处理(Handling Failures)四个部分,针对...
包装盒Wrapbox在容器(ECS,docker)中运行Ruby方法或shell命令。安装将此行添加到您的应用程序的Gemfile中: gem 'wrapbox' 然后执行: $ bundle或将其自己安装为: $ gem install wrapbox用法写config.yml default...
对于早期版本,请查看时间差异TimeDifference是缺少的Ruby方法,无法计算两个给定时间之间的时差。 您可以在年,月,周,日,小时,分钟和秒之间进行Ruby时差。安装将此行添加到您的应用程序的Gemfile中: gem '...
只需将您的模型归入一个或多个Authorizer类,并在其上编写简单的Ruby方法。 Authority可以与独立应用程序或单一登录系统配合使用。 您可以检查数据库中的角色或YAML文件中的权限。 不在乎! 它的作用是为您提供一种...
Functo是ruby中的可组合方法对象
Ruby方法跟其他编程语言中的函数非常相似, Ruby方法用于捆绑到一个单元中的一个或多个重复的语句。 方法名称应以小写字母开始。如果一个方法的名称以大写字母开始,Ruby可能会认为这是一个常数,因此可以正确解析...
主动表情符号核心Ruby方法的表情符号别名的集合。 使Ruby代码更易于阅读和编写,特别是对于儿童和不懂英语的人。 命名该项目的目的是最终将其合并到Ruby on Rails中。 下面是一些隐藏的代码: 使用这些别名,您可以...
ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby