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

示例可能是并行赋值和编写字符串的所有不同方法,也许是?

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

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

(就我所见,PHP也是动态类型的,似乎比Java / C#更灵活。再次,我的意思是在语法方面,而不是在部署方面也没有任何其他方面...)

有帮助吗?

解决方案

我不知道Java或C#,但我让你可以重新定义数字+数字的工作原理。

其他提示

至于我,Ruby中最常用的功能和Java中缺少的是代码块/ lambdas / closures。

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

另一种与Ruby非常相似的动态语言是Python。但是,在 Zen of Python 中,其中一条规则规定“ “应该有一种,只有一种”做某事的方式“。这与Ruby的极端相反,它允许如此多的元编程,基本上有无数种方法可以做同样的事情。

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

如果您有选择,我几乎建议您使用Python作为动态语言的介绍。 Ruby没有任何问题,但你可能会发现在“正确”的情况下你会遇到更少的情况。做某事的方式并不完全明显。

响应PHP动态输入:

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

Python,很可能是Ruby,实际上是强类型的,这意味着你可以自信地进行类型比较,并且不能像添加数字字符串来获取数字那样的PHP技巧。真正的动态语言通常也允许进行元分类,您可以在运行时调整实例或类的类型,或者将属性添加到其中。

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

我评论了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 重写为;

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

所有动态类型语言(如Ruby)通常比静态类型语言(如Java)更灵活。您不必使用类型系统,您通常最终会使用静态类型语言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top