当前位置:  开发笔记 > 编程语言 > 正文

除了动态类型,是什么让Ruby"比Java更灵活"?

如何解决《除了动态类型,是什么让Ruby"比Java更灵活"?》经验,为你挑选了3个好方法。

我几乎一直在使用Java,因为它刚出现,但在过去的五年中已经被烧毁了,即使做最简单的事情也变得多么复杂.我开始在我的精神科医生的推荐下学习Ruby,呃,我的意思是我的同事(年轻,冷静的同事 - 他们使用Macs!).无论如何,他们不断重复的一件事是,Ruby是一种"灵活"的语言,而不是像Java那样的老式,更加拙劣的语言,但我真的不知道这意味着什么.有人能解释是什么让一种语言比另一种语言"更灵活"?请.我对动态类型有所了解,可以看出这对简洁有什么好处.Ruby语法很漂亮.还有什么?动态打字是主要原因吗?



1> Robert Gould..:

这也是因为它是无类别的(在Java意义上),但完全面向对象(属性模式),所以你可以调用任何方法,即使没有定义,你仍然有机会动态响应调用,例如创建方法作为必需品在飞行中.Ruby也不需要编译,因此您可以根据需要轻松更新正在运行的应用程序.此外,对象可以在其生命周期中通过mixin突然从其他类/对象继承,因此它是另一个灵活点.无论如何我同意孩子们这种语言称为Ruby,它实际上和Java一样长,在许多方面都非常灵活和优秀,但我仍然无法同意它的美丽(语法方面),C是更美丽的恕我直言(我是支架的傻逼),但美是主观的,Ruby的其他品质是客观的



2> Chuck..:

动态类型并没有接近它.举一个很好的例子,Ruby在很多情况下使元编程变得容易.在Java中,元编程要么是痛苦的要么是不可能的.

例如,采用Ruby通常的方式声明属性:

class SoftDrink
  attr_accessor :name, :sugar_content
end
# Now we can do...
can = SoftDrink.new
can.name = 'Coke' # Not a direct ivar access — calls can.name=('Coke')
can.sugar_content = 9001 # Ditto

这不是一些特殊的语言语法 - 它是Module类的一个方法,并且易于实现.以下是一个示例实现attr_accessor:

class Module
  def attr_accessor(*symbols)
    symbols.each do |symbol|
      define_method(symbol) {instance_variable_get "@#{symbol}"}
      define_method("#{symbol}=") {|val| instance_varible_set("@#{symbol}", val)}
    end
  end
end

这种功能可以让您在表达程序方面获得很多灵活性.

很多看起来像语言特性(以及大多数语言中的语言特性)都只是Ruby中的常用方法.再举一个例子,这里我们动态加载其名称存储在数组中的依赖项:

dependencies = %w(yaml haml hpricot sinatra couchfoo)
block_list %w(couchfoo) # Wait, we don't really want CouchDB!
dependencies.each {|mod| require mod unless block_list.include? mod}



3> user37011..:

块,闭包,很多东西.我肯定会在早上出现一些更好的答案,但是举一个例子,这是我十分钟前写的一些代码 - 我有一系列的scheduled_collections,其中一些已经发生,其他已经废弃,取消等等我想返回一个只有待处理数组的数组.我不确定相同的Java是什么,但我想这不是这种单行方法:

def get_all_pending
  scheduled_collections.select{ |sc| sc.is_pending? }
end

一个更简单的例子是:

[0,1,2,3].select{|x| x > 1}

哪个会产生[2,3]

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有