我是学习Ruby的新手,还是它有比Java / C#更多的方法来编写(相同的)东西?另外,如果它比Java更灵活,那么Ruby的语言特征是否通常不用于避免混淆?
示例可能是并行赋值和编写字符串的所有不同方法,也许是?
注意:我不是要求与Java / C#进行比较...只是这个语言问题,请...
编辑:我知道C#,Java和Ruby是强类型的,并且只有Ruby(如Python和其他)是动态类型的(而Java / C#是静态类型的)。一些答案说动态类型的语言更灵活。这是否正确,它如何影响语法? 我只询问语法灵活性。
(就我所见,PHP也是动态类型的,不似乎比Java / C#更灵活。再次,我的意思是语法方面,而不是部署方面也没有任何其他方面...)
答案 0 :(得分:8)
至于我,Ruby中最常用的功能和Java中缺少的是代码块/ lambdas / closures。
另一个很棒的(但可能是危险的)功能是开放类 - 你可以改变你想要的任何类 - 添加新方法,改变旧类等。你甚至可以将方法添加到特定对象,而不是整个类:)。
答案 1 :(得分:4)
另一种与Ruby非常相似的动态语言是Python。然而,在Zen of Python中,其中一条规则规定“应该有一种,只有一种方式”。这与Ruby的极端相反,它允许如此多的元编程,基本上有无数种方法可以做同样的事情。
也就是说,它有点讽刺,直到Python 3.0(又名:3000)字符串和unicode值是不同的类型。虽然这是有道理的,但人们有时会遇到问题,他们在两者之间进行大量转换以执行文本操作。
如果您有选择,我几乎建议您使用Python作为动态语言的介绍。 Ruby没有任何问题,但是你可能会发现在遇到“正确”做事方式不太明显的情况下,你会遇到更少的情况。
响应PHP动态输入:
PHP的类型系统是灵活的,允许根据它们使用的上下文自动转换类型。但是,这实际上并不构成真正的动态类型。语言本身大多是静态的,并且不允许您在运行时向对象添加属性,例如(至少,我最后一次检查)。
Python,很可能是Ruby,实际上是强类型的,这意味着你可以自信地进行类型比较,并且不能像添加数字字符串来获取数字那样的PHP技巧。真正的动态语言通常也允许进行元分类,您可以在运行时调整实例或类的类型,或者将属性添加到其中。
答案 2 :(得分:1)
Ruby是一种动态语言。 C#和Java都是静态类型语言,具有强类型。 v4.0中的C#将添加动态功能,但到目前为止,Java和C#与Ruby和Python等动态语言有着完全不同且更严格的范例。
答案 3 :(得分:1)
我评论了rkj上面关于lambda的回答。此代码演示了您要求的示例;
def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end
def fixed_point(x, point, process, test)
return point if test.call(x, point)
fixed_point(x, process.call(x, point), process, test)
end
def sqrt(n)
process = lambda {|n,g| average g, (n/g) }
test = lambda {|n,g| abs(square(g) - n) < 0.001}
fixed_point(n, 1.0, process, test)
end
需要注意的第一点是fixed_point
方法处理将进程逐步应用于某些数据的一般想法,直到它通过某个测试为止。 sqrt
函数定义了查找平方根的过程以及确定何时满足的测试。然后,这些“程序”就像任何其他形式的数据一样被传递,这样fixed_point
就可以发挥它的神奇作用。
而不是临时存储过程并测试整个过程可能是匿名的。我们可以重写sqrt
as;
def sqrt(n)
fixed_point( n, 1.0,
lambda {|n,g| average g, (n/g)},
lambda {|n,g| abs(square(g) - n) < 0.001} )
end
如果没有这种能力,我必须将过程和测试定义为单独的函数,并创建一个特殊的sqrt_fixed_point
函数来调用它们。据我所知,Java可以使用Functors做类似的事情但我不知道评论。我在博客或类似网站上看到的共识是,Java使得它变得如此复杂,以至于你只会尝试它而感到鼻血。
当然,Ruby提供的另一个选择是元编程。我可以重写sqrt
,以便使用正确的过程和测试重写(动态)fixed_point
,但这可能是滥用该功能: - )
PS。 JoelOnSoftware链接发布值得重复; http://www.joelonsoftware.com/items/2006/08/01.html
答案 4 :(得分:0)
所有动态类型语言(如Ruby)通常比静态类型语言(如Java)更灵活。您不必使用类型系统,您通常最终会使用静态类型语言。
答案 5 :(得分:-3)
我不知道Java或C#,但我让你可以重新定义数字+数字的工作原理。