3

是我是一个学习 Ruby 的新手,还是它真的有比 Java/C# 更多的方法来编写(相同的)东西?另外,如果它比 Java 更灵活,那么 Ruby 是否有任何语言特性通常使用以避免混淆?

示例可能是并行分配以及编写字符串的所有不同方式,也许?

注意:我不是要与 Java/C# 进行比较......请只是这个语言问题......

编辑:我知道 C#、Java 和 Ruby 是强类型的,并且只有 Ruby(如 Python 和其他)是动态类型的(而 Java/C# 是静态类型的)。一些答案说动态类型语言更灵活。这一定是真的吗?它如何影响语法?我只是在问句法灵活性。

(据我所见,PHP 也是动态类型的,它似乎并不比 Java/C# 更灵活。同样,我的意思是在语法方面,而不是在部署方面或任何其他方面......)

4

6 回答 6

8

对我而言,Ruby 中最常用而 Java 中缺少的特性是代码块/lambdas/闭包。

另一个很棒(但可能很危险)的特性是开放类——你可以改变你想要的任何类——添加新方法、改变旧方法等。你甚至可以将方法添加到特定对象,而不是整个类:)。

于 2009-01-01T09:46:59.940 回答
4

另一种与 Ruby 非常相似的动态语言是 Python。然而,在Python 之禅中,其中一条规则规定“应该有一种,而且只有一种做某事的方式”。这与 Ruby 截然相反,Ruby 允许进行如此多的元编程,以至于基本上有无数种方法可以做同样的事情。

也就是说,直到 Python 3.0(又名:3000)字符串和 unicode 值都是不同的类型,这有点讽刺。虽然这是有道理的,但人们有时会遇到在两者之间进行大量转换以执行文本操作的问题。

如果您有选择,我几乎建议您使用 Python 作为对动态语言的介绍。Ruby 并没有什么问题,但是您可能会发现您会遇到更少的情况,即做某事的“正确”方法并不完全显而易见。

响应 PHP 被动态输入:

PHP 的类型系统很灵活,允许根据使用的上下文自动转换类型。然而,这实际上并不能生成真正的动态类型。例如,语言本身大部分是静态的,并且不允许您在运行时向对象添加属性(至少,我上次检查时)。

Python,很可能是 Ruby,实际上是强类型的,这意味着您可以自信地进行类型比较,而不能使用 PHP 技巧,例如添加数字字符串以获取数字。真正的动态语言通常还允许元分类,您可以在其中调整实例或类的类型,或向其中任何一个添加属性,所有这些都在运行时进行。

于 2009-01-01T08:25:12.523 回答
1

Ruby 是一种动态语言。C# 和 Java 都是具有强类型的静态类型语言。v4.0 中的 C# 将添加动态功能,但到目前为止,Java 和 C# 与动态语言(如 Ruby 和 Python)相比,具有完全不同且更严格的范式。

于 2009-01-01T07:38:51.713 回答
1

我评论了上面关于 lambda 的 rkj 的回答。此代码演示了您要求的示例;

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为;

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 可以使用 Functor 做类似的事情,但我不知道如何评论。我在博客或类似文章中看到的共识是,Java 使这变得非常复杂,以至于您尝试一下就会流鼻血。

当然,Ruby 提供的另一个选择是元编程。我可以重写sqrt,以便它fixed_point使用正确的过程和测试(即时)重写,但这可能是对该功能的滥用:-)

附言。发布的 JoelOnSoftware 链接值得重复;http://www.joelonsoftware.com/items/2006/08/01.html

于 2009-10-16T18:43:59.063 回答
0

所有动态类型语言(如 Ruby)通常比静态类型语言(如 Java)更灵活。您不必与类型系统作斗争,而您通常最终会在静态类型语言中这样做。

于 2009-01-01T08:07:03.420 回答
-3

我不知道 Java 或 C#,但我让你可以重新定义 + 如何在数字上工作的事实不言自明。

于 2009-01-01T11:07:18.813 回答