Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除了动态类型之外,是什么让Ruby;“更灵活”;而不是Java?_Java_Ruby_Duck Typing_Dynamic Languages - Fatal编程技术网

除了动态类型之外,是什么让Ruby;“更灵活”;而不是Java?

除了动态类型之外,是什么让Ruby;“更灵活”;而不是Java?,java,ruby,duck-typing,dynamic-languages,Java,Ruby,Duck Typing,Dynamic Languages,自从Java问世以来,我就一直在使用它,但在过去的五年里,我对它变得多么复杂以至于连最简单的事情都要完成感到厌倦。在我的精神病医生的推荐下,我开始学习Ruby,呃,我的意思是我的同事(更年轻、更酷的同事——他们使用Mac!)。不管怎么说,他们不断重复的一件事是,与较旧、较陈旧的语言(如Java)相比,Ruby是一种“灵活”的语言,但我真的不知道这意味着什么。有人能解释一下是什么使一种语言比另一种语言“更灵活”吗?请我有点明白动态键入的意思,并且可以看出这对简洁性有什么好处。Ruby语法非常漂亮。

自从Java问世以来,我就一直在使用它,但在过去的五年里,我对它变得多么复杂以至于连最简单的事情都要完成感到厌倦。在我的精神病医生的推荐下,我开始学习Ruby,呃,我的意思是我的同事(更年轻、更酷的同事——他们使用Mac!)。不管怎么说,他们不断重复的一件事是,与较旧、较陈旧的语言(如Java)相比,Ruby是一种“灵活”的语言,但我真的不知道这意味着什么。有人能解释一下是什么使一种语言比另一种语言“更灵活”吗?请我有点明白动态键入的意思,并且可以看出这对简洁性有什么好处。Ruby语法非常漂亮。还有什么?动态键入是主要原因吗?

我喜欢的东西

  • 更少的代码来表达你的观点
  • 传递代码块(Proc、lambdas)很有趣,可以产生更小的代码。e、 g.
    [1,2,3]。每个{x}放置“下一个元素{x}”}
  • 具有PERL的脚本根。。非常好地切分常规的东西,比如用regexps解析文件等等
  • 核心数据结构类API(如哈希和数组)做得很好
  • 元编程(由于其动态特性)-能够创建自定义DSL(例如,Rails可以称为用Ruby编写的Web应用程序的DSL)
  • 这是一个为任何事情孕育宝石的社区

这也是因为它是一种无类(Java意义上)但完全面向对象(属性模式)的方法,因此您可以调用任何方法,即使没有定义,您仍然有最后一次机会动态响应调用,例如动态创建必要的方法。此外,Ruby不需要编译,因此如果需要,您可以轻松地更新正在运行的应用程序。另外,一个对象在其生命周期内的任何时候都可以通过mixin突然从另一个类/对象继承,因此这是另一个灵活性点。无论如何,我同意孩子们的看法,这种叫做Ruby的语言,实际上早在Java时代就存在了,在很多方面都非常灵活和伟大,但我仍然不能同意它的美好(语法方面),C更美好(我喜欢括号),但美是主观的,Ruby的其他特性是客观的

混合。修改Ruby类以添加新功能非常简单。

Duck typing指的是类型被认为是等效的,而不是基于它们所声明的类型。举个具体的例子,Ruby中的许多方法都使用类似IO的对象对流进行操作。这意味着该对象必须实现足够多的函数才能作为IO类型的对象传递(它必须听起来足够像鸭子)


最后,这意味着要做同样的事情,您必须编写比Java更少的代码。不过,动态语言并非事事都好。您或多或少地放弃了Java(和其他强/静态类型语言)提供的所有编译时类型检查。Ruby根本不知道是否要将错误的对象传递给方法;这将给您一个运行时错误。此外,在实际调用代码之前,它不会给出运行时错误。

块、闭包等等。我相信早上会出现一些更好的答案,但举个例子,这里是我十分钟前写的一些代码-我有一个计划的集合数组,其中一些已经发生,其他的已经作废、取消,等等。我只想返回一个数组,其中只包含那些挂起的集合。我不确定等效的Java是什么,但我想它不是这一行方法:

def get_all_pending
  scheduled_collections.select{ |sc| sc.is_pending? }
end
一个简单的例子是:

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

这将产生[2,3]

只是为了取笑,这是语言灵活性的一个相当恶劣的例子:

class Fixnum
  def +(other)
    self - other
  end
end

puts 5 + 3
# => 2

动态键入并不能覆盖它。举个大例子,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\u访问器的示例实现:

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}

你说的“做得好”是什么意思?v-Ruby数组的所有操作都是现成的方法:映射器、迭代器、堆栈操作、过滤、选择、反转、排序等等。。java会要求您编写相同的for loop n times重新定义加号操作符来执行减法当然是灵活的。什么样的灵活?正如你自己所说,这是相当令人讨厌的。但这段代码也非常简单。谢谢你给我举个例子,这让我很害怕。在坏人手中,这可能意味着世界毁灭。哇,这太可怕了!!我希望从来没有人用Ruby编写过NuclearBomb管理系统。哦,等等,即使是用C,你也可以定义你的软饮料示例“元编程”是什么?对于getter和setter来说,这不是和我们在Java中使用的sytax不同吗?在Java中,那将是,哦,我不知道,一打或两打额外的代码行。但它基本上也会做同样的事情。对吗?我不确定我是否明白你的意思。实际上,仔细想想,我甚至不确定“元编程”是什么意思。哦,等等,我想我现在明白了,define_方法实际上是在动态地设置访问器方法。好的,那很酷,没错。元编程是编写代码的代码。您可以将重复的模式转换为简单的声明性语句,然后实例变量获取并设置ar