• JIT for MRI 开始开发了 at 2020年06月15日

    确实,这个 JIT 有点粗糙了,JVM 的 JIT,V8 的 JIT 等等这些 JIT 可是直接内存生成不依赖其他编译器 (GCC,LLVM 等),希望 Ruby 以后可以慢慢改进吧,毕竟人手有限,直接生成 JIT 没那么简单做出来

  • 谢谢,明白了

  • 你这个是运行啊,我说的是在 cmd 中直接输入 ruby 不加任何东西,似乎会进入到一个输入界面,但我尝试输入任何东西都没有反应,然后你输入 end 就报错推出了,我想问的是这个输入界面有什么用 有人知道吗?

  • 你没懂我的意思,我的意思是可以在某些设计上统一,只是不愿这样做罢了,|x| 看上去不是一个很好的选择,完全可以用 lambda 代替

  • 关键字多少与语言看不看得懂没有直接关系,关键字只要够用就可以,其实能不能统一只是现在的结果已经不统一了,然而设计之初如果统一了现在来看也没有什么不妥

  • 我可没转移话题,是你说他们是虾兵蟹将的,这些语言正是因为是多范式的所以也更加灵活,他们不是完全面向对象,但包含了面向对象的思想,那么 ruby 为什么不能反过来在面向对象的基础上加入一些函数式特性呢,目前官方已经这样做了,但还不够好,首先 define_method 和你外面的 def 的语法就不一致,|*args| 看起来也不够好,call 也有点多此一举,如果 ruby 能改成以下写法你看会不会更好呢?

    def self.log m
      def method *args
        p "输入是:#{args}"
        m(*args)
      end
      return method
    end
    
    log def foo x, y
      x + y
    end
    
    result = foo(2,3)
    puts result
    

    但是这是不可能的,看看就好

  • 你看用 ruby 写的话可能就需要 |x|,define_method 这种东西了,我下面的 python 代码没有用到类,纯方法级别的装饰器

    #Aop-用于输出日志
    def log(fn):
        def method(*param):
            print("输入是:" + str(param))
            return fn(*param)
        return method
    
    @log
    def foo(x,y):
        return x + y
    
    result = foo(2,3)
    print(result)
    

    大家是和平讨论,你在这里贬低 JavaScript,Python 这些语言说是虾兵蟹将,这些语言难道就没有学习 smalltalk 语言吗,纯粹的面向对象是不存在的,因为任何一个通用语言都有例外的时候,除非你是 DSL。我说的一切不是来引战,我非常喜欢 ruby,写起来很优美,但有时又不够优美,这让人很纠结

  • 是的,你可以说所有的东西我都可以自己实现,从你开始自己写元编程实现装饰器的时候已经 “不够简洁了”,但有总比没有好,“所以我说如果能加一个方法级别的装饰器语法糖之类的会更好”。

  • 不不不,你没理解我说的,你这叫语法的二义性,你如果明白我说的方法其实是一个变量就自然理解了(但问题是在 ruby 中 def 定义的方法不是一个变量),归根到底还是 def 定义的方法没有类型,而 proc,lambda 或者 method :xxxx 返回的是一个对象,这是设计上的问题,因为 ruby 语言历史悠久现在改已经不可能了,也就是 matz 说的 lisp-2 语义 如果大家都是方法那么调用格式应该统一,这样你说的所谓的多态其实只会增加复杂度,官方已经回复了,基本不可能改了。

  • sig 是由 sorbetrb 提供的一个元编程产物,但 python 的 @ 是语言内置的,而且他们在行为上也有一些区别。