除了动态类型之外,是什么让Ruby;“更灵活”;而不是Java?
自从Java问世以来,我就一直在使用它,但在过去的五年里,我对它变得多么复杂以至于连最简单的事情都要完成感到厌倦。在我的精神病医生的推荐下,我开始学习Ruby,呃,我的意思是我的同事(更年轻、更酷的同事——他们使用Mac!)。不管怎么说,他们不断重复的一件事是,与较旧、较陈旧的语言(如Java)相比,Ruby是一种“灵活”的语言,但我真的不知道这意味着什么。有人能解释一下是什么使一种语言比另一种语言“更灵活”吗?请我有点明白动态键入的意思,并且可以看出这对简洁性有什么好处。Ruby语法非常漂亮。还有什么?动态键入是主要原因吗?我喜欢的东西除了动态类型之外,是什么让Ruby;“更灵活”;而不是Java?,java,ruby,duck-typing,dynamic-languages,Java,Ruby,Duck Typing,Dynamic Languages,自从Java问世以来,我就一直在使用它,但在过去的五年里,我对它变得多么复杂以至于连最简单的事情都要完成感到厌倦。在我的精神病医生的推荐下,我开始学习Ruby,呃,我的意思是我的同事(更年轻、更酷的同事——他们使用Mac!)。不管怎么说,他们不断重复的一件事是,与较旧、较陈旧的语言(如Java)相比,Ruby是一种“灵活”的语言,但我真的不知道这意味着什么。有人能解释一下是什么使一种语言比另一种语言“更灵活”吗?请我有点明白动态键入的意思,并且可以看出这对简洁性有什么好处。Ruby语法非常漂亮。
- 更少的代码来表达你的观点
- 传递代码块(Proc、lambdas)很有趣,可以产生更小的代码。e、 g.
[1,2,3]。每个{x}放置“下一个元素{x}”}
- 具有PERL的脚本根。。非常好地切分常规的东西,比如用regexps解析文件等等
- 核心数据结构类API(如哈希和数组)做得很好李>
- 元编程(由于其动态特性)-能够创建自定义DSL(例如,Rails可以称为用Ruby编写的Web应用程序的DSL)
- 这是一个为任何事情孕育宝石的社区
最后,这意味着要做同样的事情,您必须编写比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