编程语言
首页 > 编程语言> > 除了动态类型,是什么让Ruby“比Java更灵活”?

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

作者:互联网

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

解决方法:

动态类型并没有接近它.举一个很好的例子,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}

标签:java,ruby,dynamic-languages,duck-typing
来源: https://codeday.me/bug/20190711/1435216.html