Tag: 语言设计

call / cc的语义和Ruby中的“确保”

据我所知,到目前为止,Ruby是唯一支持call/cc和try/catch/finally (编写为begin/rescue/ensure/end块)的主流语言。 我不熟悉Ruby,但我的直觉告诉我这两个可能存在冲突,因为call/cc允许任意控制流并ensure需要一些保证控制流(某些代码路径必须在预定义的情况下执行,即离开含有块)。 那么,语言中是否存在任何冲突? 如果是这样,在这种情况下语言的定义行为是什么? 特别是,如果在begin/ensure块或ensure/end块中使用call/cc会发生什么? 如果在块包含ensure子句后调用捕获的call/cc怎么办?

总是有三等于的语言

从一开始就有意设计了哪些流行的编程语言同时具有===和==(并且要求程序员找出使用哪一种)。 Javascript,PHP,ruby(可能还有其他人)今天拥有一个三等号运算符。 但是,目前尚不清楚这是一个刻意的设计决定,还是只是偶然发生(也许是因为语言以双等号开头,但在某些时候发现双等于人们并不是在做人们想做的事情)。 特别是在javascript中,有人记得它第一次出现时是否有三等号?

为什么Ruby有这么多的冗余?

我爱Ruby,在过去的几年里,它是我的首选语言。 但是,即使从我开始学习它,我也被这样的事实所击退:通常有几种方法可以做同样的事情(或同等的事情)。 我将举几个例子: 方法通常有别名,所以你总是不得不费心去选择最合适,最受欢迎或普遍接受的替代品 and , or ,除了&&和|| – 只需看看它们之间的混淆优先级差异有多大 for keyword,几乎完全由没有经验的非本机Ruby开发人员使用 这种设计决策背后的理由是什么? 他们(Matz?)是否认为语言更容易采用,因此更受欢迎?

字符串/范围比较问题

这对于以下事情有意义: irb(main):001:0> [“b”, “aa”, “d”, “dd”].sort => [“aa”, “b”, “d”, “dd”] 但不适用于: irb(main):002:0> (“B”..”AA”).each{ |x| print “#{x},” } => “B”..”AA” 应该产生:B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y ,Z,AA,=>“B”……“AA”但“B”>“AA”=>真 与“B”不同。“BA”(“B”>“BA”=> false): irb(main):003:0> (“B”..”BA”).each{ |x| print “#{x},” } B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,=> “B”..”BA” 任何建议使“b”..“aa”按预期在ruby中工作? 我用 irb 0.9.5(05/04/13)ruby 1.8.7 (2009-06-12补丁级别174)[i486-linux] Linux 2.6.31-19-generic#56-Ubuntu SMP Thu Jan 28 01:26:53 UTC 2010 i686 GNU / Linux

为什么’super’是关键字而不是Ruby中的方法?

在Ruby中, super是关键字而不是方法。 为什么这样设计? Ruby的设计倾向于尽可能多地实现方法; 关键字通常保留用于具有自己的语法规则的语言function。 然而, super看起来像一个方法调用。 (我知道在纯Ruby中实现super会很麻烦,因为它必须从caller解析出方法名,或者使用trace_func 。仅此一项不会阻止它成为一种方法,因为内核很多方法没有在纯Ruby中实现。)

为什么Ruby使用自己的语法来安全导航操作符?

Ruby 2.3.0引入了安全的导航语法 ,通过引入一个仅在前一个语句的值不为nil时调用该方法的新运算符,简化了对链式方法调用的零处理。 这是一个已经存在的function,例如在C#,Groovy和Swift中。 例如在Groovy中 ,语法是 foo?.bar 这基本上意味着结果值是foo.bar的结果值,除非foo为null ,在这种情况下返回值也为null ,因此不会抛出exception。 此外, C# (称为空条件运算符 )和Swift (称为可选链接表达式 )使用此表示法。 所以语法似乎在其他语言中非常标准。 现在,为什么在Ruby中语法是 foo&.bar 代替?

Ruby Assignment语法

一个愚蠢的句法问题: 如果赋值运算符实际上是一个函数,就像 def value=(x) @value = x end 如果左侧操作数和“=”之间没有空格,那么为什么可以将赋值作为test.value = x(带空格),但方法定义不能写为: def value = (x) @value = x end 与空间。 这是解析器所决定的简单语法吗?

“私人”是否有充分的理由像Ruby一样工作?

我花了一段时间才了解私有方法在Ruby中是如何工作的,这让我觉得非常尴尬。 有谁知道私人方法是否有充分的理由按照它们的方式处理? 这只是历史原因吗? 还是实施原因? 还是有很好的合理逻辑(即语义)? 例如: class Person private attr_reader :weight end class Spy < Person private attr_accessor :code public def test code #(1) OK: you can call a private method in self Spy.new.code #(2) ERROR: cannot call a private method on any other object self.code #(3) ERROR!!! cannot call a private method explicitly on […]

“猴子补丁”真的那么糟糕吗?

像Ruby和JavaScript这样的语言有开放类,允许你修改偶数核心类的接口,如数字,字符串,数组等。显然,这样做可能会使熟悉API的其他人感到困惑,但是有充分的理由要避免使用它们。 ,假设您正在添加到界面而不是更改现有行为? 例如,将一个Array.map实现添加到未实现ECMAScript第5版的Web浏览器(如果您不需要所有jQuery)可能会很好。 或者你的Ruby数组可能会受益于使用“inject”的“sum”方便方法。 只要更改被隔离到您的系统(例如,不是您发布用于分发的软件包的一部分),是否有充分的理由不利用此语言function?

为什么Ruby的“获取”包括结束换行?

我从来不需要得到的结尾换行符。 有一半的时间我忘记了它,这是一个痛苦…. 为什么会这样?