`

ruby方法

    博客分类:
  • ruby
阅读更多
没事做,写着玩的。不过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)。
分享到:
评论

相关推荐

    06Ruby 方法.docx

    ### Ruby 方法详解 #### Ruby 语言简介 Ruby 是一种动态、面向对象的脚本语言,以其简洁、清晰的语法著称。它支持多种编程范式,包括面向对象、命令式和函数式编程,并且拥有强大的元编程能力。Ruby 的设计哲学强调...

    Ruby 方法、类

    在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字...

    sjqzhang#webtech#Ruby 方法1

    语法所以,您可以定义一个简单的方法,如下所示:您可以定义一个接受参数的方法,如下所示:def method_name (var1, var2)您可以为参数设置默

    Ruby-Savon是一个Ruby编程语言的SOAP客户端

    一旦客户端建立,你可以像调用Ruby方法一样调用SOAP服务的函数,Savon会处理所有细节: ```ruby response = client.call(:some_method, message: {param1: "value1", param2: "value2"}) ``` Savon还支持一些高级...

    methodsolver:查找使用占位符给定块的Ruby方法

    方法求解器查找给定占位符的Ruby方法。 例如: solve { h = { a : 1 , bunny : 2 , c : 3 } h . ______ ( :bunny ) h . keys == [ :a , :c ]} 会发现#delete 请谨慎使用! 当心副作用。 求解器尝试使用接收器上找到...

    Ruby编辑器scite F5可以运行

    例如,你可以设置自动完成来帮助输入常见的Ruby方法,使用宏记录来自动化重复的任务,或者定制编译器设置来适应不同的项目需求。通过熟练掌握Scite,开发者能够在保持代码质量的同时,提高开发速度,提升整体工作...

    Ruby-ParallelRuby让并行处理简单和快速

    除了`each`方法,Parallel库还提供了其他方法,如`map`、`inject`等,这些都是并行版本的内置Ruby方法,方便在并行环境下使用熟悉的编程模式。 在实际应用中,理解并行处理的潜在问题也至关重要,如数据竞争、死锁...

    Ruby-redisrbRedis的一个Ruby客户端库

    1. **API设计**: `redis-rb`库提供了简洁的Ruby接口,几乎每一个Redis命令都有对应的Ruby方法,使得开发者能直接调用,例如`get`、`set`、`hset`等。 2. **连接管理**: 库允许创建并管理Redis连接池,方便在多线程...

    funkify:Ruby 方法的 Haskell 风格部分应用和组合

    风化Ruby 方法的 Haskell 风格部分应用和组合函数组合与部分应用程序结合使用时可以产生异常简洁的代码,通常比惯用的 Ruby 更简洁。 查看下面的链接,进一步解释这些特性以及它们在 Haskell 中的使用示例:此外,...

    turkish_support:土耳其语字符对核心Ruby方法的支持

    土耳其语支持 土耳其语支持核心Ruby方法。 这个gem提供了几乎所有String方法的支持,例如String#split , String#match , String#gsub 。 它还提供对Array#sort和一些奖励方法(如String#titleize 。要求Ruby&gt; = ...

    method_pattern:Ruby方法的模式匹配

    Ruby方法的模式匹配 安装 将此行添加到您的应用程序的Gemfile中: gem 'method_pattern' 然后执行: $ bundle 或将其自己安装为: $ gem install method_pattern 用法 扩展您希望能够与MethodPattern模块一起...

    mongo-ruby-driverMongoDB的Ruby驱动程序

    4. **插入和更新**:插入文档到集合,或者更新现有文档,都可通过简单的Ruby方法实现。这包括单个文档的操作,也包括批量操作。 5. **索引管理**:驱动程序提供了创建、查看和删除索引的接口,帮助优化查询性能。 ...

    ruby 程序设计

    - **默认返回值**:Ruby方法的最后一句表达式的值即为方法的返回值。 - **显式返回值**:使用`return`关键字显式指定返回值。 #### 八、模块 ##### §8.1 名字空间 - **概念**:模块可以作为名字空间,避免名称...

    pwned:使用Pwned Passwords API的简单Ruby方法

    使用Pwned Passwords API的一种简单的Ruby方法。 | 目录 关于 Troy Hunt的允许您检查是否在任何重大数据泄露事件中找到密码。 Pwned是一个Ruby库,可以使用Pwned Passwords API的 Anonymity 针对API测试密码,而...

    optionable:Ruby 方法的强大选项验证

    传递给 Ruby 方法的选项的稳健验证。 兼容性 BSON 针对 MRI (1.9.2+)、JRuby (1.7.0+)、Rubinius (2.0.0+) 进行了测试。 安装 使用 bundler,将optionable gem 添加到您的Gemfile 。 gem "optionable" , 在您的...

    benchmark_methods:对Ruby方法进行基准测试并衡量其执行时间,而无需进行其他代码更改

    测量并确定Ruby方法的执行时间。 忘记了Time.now - t解决方案。 使用benchmark来查看执行您的方法需要多少时间。 样品或用法: 安装 将此行添加到您的应用程序的Gemfile中: gem 'benchmark_methods' 然后执行: ...

    Roogle:通过近似类型签名的 Ruby 方法搜索引擎

    罗格通过近似类型签名的 Ruby 方法搜索引擎如何使用 $ git clone https://github.com/Azabuhs/Roogle.git $ cd Roogle $ cabal sandbox init $ cabal install --only-dependencies $ cabal build $ ./dist/build/...

    show_code:show_code提供了一种在终端中显示ruby方法源代码的快速方法-Show source code

    show_code提供了一种在终端中显示您的ruby方法源代码的简便方法。 注意:show_code当前版本需要Ruby v1.9.0或更高版本。 安装 # Installing as Ruby gem $ gem install show_code # Or in gemfile $ gem show_code ...

    ruby hacking guide 中文版教程

    6. **Ruby C API**:对于想要深入到Ruby底层的开发者,书中有章节介绍如何使用Ruby的C API来扩展Ruby,创建C语言编写的Gem,这包括了如何创建Ruby对象、调用Ruby方法和处理Ruby数据类型等。 7. **调试与性能优化**...

    本书是由华中科技大学出版社于2017年3月出版的程序设计类图书,书中总结了三十余条Ruby程序开发经验,有助于读者理解学习。

    作者Avdi Grimm主张Ruby方法应该像故事一样易于阅读。他将Ruby方法分成输入处理(Collecting Input)、功能实现(Performing Work)、输出 处理(Delivering Output)、失败处理(Handling Failures)四个部分,针对...

Global site tag (gtag.js) - Google Analytics