把线程方案那段注释去掉 98 行 :D
可以直接用。比如你有 10 个爬虫任务,丢给这个类。完全可以使用。并不是玩具代码。 :D
个人结缘 Ruby 的故事:曾经的老东家是 Ruby 起步,一路走到美股上市。虽然是前端岗,但是对每天合作的后端同学使用的这门语言其实是最熟悉的陌生语言。
后来有一个机缘巧合希望可以做一个轻量级的语言,了解到以 DSL 为特性的 Ruby。踏破铁鞋无觅处,得来全不费工夫。
初步了解 Ruby 之后,觉得设计性十分有趣。后来学习关于 Ruby 内部原理、元编程、设计模式……一发不可收拾。
Ruby 的内部相对于我经常用的语言 具有内在的设计一致性,最小惊讶原则,一致性的面向对象,吸取了 LISP 的动态性,但是又保持克制。我曾经幻想过有没有一个语言可以实现文学性编程的想法,Ruby 可以实现这点,可以设计出可读性出色的程序。我最喜欢的除了它内部还有他的标准库,我称之为 有求必应标准库。凡是我所想到的,皆有实现。从常见的线程,到内部数据库实现,还有分布式支持……
后来一段时间,我研究过 Ruby 的 Web 框架,浅尝辄止了 Rails,重点关注了 Rack、Sinatra、Roda,实现。可能来自于我对 微框架和自己掌控的偏好。我反而不熟悉 Rails,这是十分另类的。
Ruby 成了良师益友,可以学习她现存的资产,也可以使用助自己一臂之力。深入理解 Ruby 丰富的特性,当你遇到看到一些别的语言的特性,总能在 Ruby 中寻找到对应的存在。
现在 Ruby 是我的第二语言,我喜欢用它学习,实现原型,实现脚本解决我工作中的问题,做自己的网站,还有小游戏;偶尔工作中,我也会塞点 Ruby 的项目进去。 :D
我对 Matz 作者也很感兴趣,也喜欢读 Matz 的书。他是我比较喜欢的类型的程序员,爱表达自己的思考、细致、谨慎、思考全面,从他的文章可以看出他的思考。我很欣赏作者这样自省又对外有所思考的人。Ruby 对外有一种日式匠人打磨的感觉。
对 Ruby 的喜欢比较由内而外。也认可动态语言是一种趋势。靠近 LISP 的是正确的方向。
随缘写下故事。最后,Ruby 的闪光点一定会被欣赏的人看到。
计算机发展快 30 年了。低代码也不是新概念。
后台做做表单,固定的活动页面可以。但是如果是活动页,可是这种东西,往往没啥竞争力 —— 因为无聊,没有表现力。
如果做不到图灵完备,等于不算真正的低代码。只能算是 组件拼接器。 如果做到图灵完备了,那和写代码一样了,还不如写代码。与其交给运营、产品写。不如交给专业的人做专业的事情。
个人愚见,能解决重复的任务。但是重要任务,他就没有重复的。
产品是不断应对市场变化、竞争对手的。所以他必须不断与时俱进。总结就是没啥未来。毕竟历史上反反复复出现 N 次了,太阳下没啥新鲜事。
参考: Qt 有低代码编辑器,依然不如写代码好维护; 虚幻游戏引擎有蓝图,依然工程师需要写代码。
代码本身就是终极之道了其实。
也许是印度开发小哥删一半忘了
Ruby
Rust 就很离谱。那么多基础设施工程师么
TheoremProving
不过进入陌生领域了,Mathematica 也有定义证明。我就贴上了,这部分没做过。没有发言权了。
https://reference.wolfram.com/language/guide/TheoremProving.html
看看 Mathematica ? 不过我好久没用了,只在大学做实验用过。MA 里面不关心类型,而且帮助数学家们推演公式。先进的数学编程语言,是自己从头实现的。python 数学库和 MA 相比是个弟弟
潮流是个大摆锤,今天锤锤这,明天锤锤那。
静态型没啥未来。研究研究 SICP,抽象才是编程技术绝妙的地方。
比如你在书写数学,不会关心数字类型。未来的语言也不应该关心类型。这些都是底层的细节,应该被屏蔽掉。 今天之所以需要关心,还是迫于实现细节或者性能妥协。
动态语言依然是未来的方向。静态型的语言做做基础工具,会被当成汇编永远活在幕后。
emmm,这看起来很正常啊。
ruby 是动态语言,声明方法只会注册,真正执行的时候才会运行。
函数内返回函数,也是一个支持函数范式的特性。可以建立起函数式编程。py、js 里也是可以。
有意义。要不然 Ruby 的领域面就一直很狭隘,处在服务器侧的 web 领域(这只是个一个小小的地盘)。
拒绝 windows 等于拒绝了 —— GUI 程序、办公自动化、一大批新手玩家、外挂领域、等于拒绝市场上最大占比的操作系统。
ruby 能够在 win 上工作,终于 rb 可以和 python 一样也出 Excel 教程了!!!哈哈哈,与之一战
作好不容易
require 'benchmark'
def fib n
if n < 2
1
else
fib(n-2) + fib(n-1)
end
end
# 直接执行
puts Benchmark.measure {
8.times do
fib(40)
end
}
# 进程
puts Benchmark.measure {
8.times do
fork { fib(40) }
end
Process.wait
}
# 线程
puts Benchmark.measure {
8.times.map {
Thread.new{fib(40)}
}.each{|t| t.value}
}
# Ractor
puts Benchmark.measure {
8.times.map {
Ractor.new{ fib(40) }
}.each{|r| r.take}
}
方法 | user time | system time | user+system times | real time |
---|---|---|---|---|
顺序执行 | 84.713012 | 0.131839 | 84.844851 | 84.845332 |
进程 | 0.000214 | 0.002798 | 14.607795 | 14.787335 |
多线程 | 84.604395 | 0.145657 | 84.750052 | 84.744966 |
Ractor | 116.438639 | 0.148765 | 116.587404 | 14.853680 |
答案是 Ractor 和多进程差不多快
商业公司支持的语言,早晚受到限制。比如 Java,收割你。
Nodejs 的社区 npm 包质量太次,普遍进入维护期了,疯狂报 warning
Python 的问题在于永远无法拥有真正的 JIT。没有标准化实现,Instagram、Dropbox 使用 Python 的都尝试过研发 Python-JIT 已经失败了好几轮 Python 社区,我怀疑混入了 Node 社区的人,花式加一些无用的语法最近。
Ruby 唯一没有金主爸爸。这个角度,他是属于自由个人的选择。 Ruby 的 gem 幸存下来的,都经过一番洗礼,质量都挺高。保持小众,猥琐发育也挺好。要像 npm 那样,100w 的包,一半都失效了,各种问题。。。也是蛋疼。
小众好处也是一种筛选吧,真正热爱的人会继续搞好的。像 Java 作为大众蓝领语言,已经膨胀到难以理解了。
不管怎么样,我会继续偷着用 Ruby
可能这就是它的优势所在。
就像 lisp 程序,程序就是在写 AST 一样
Yep, I can
B 站直播怎么样,给老铁刷火箭
补充,想要运行里面的返回函数怎么办呢?
method(a()).call
可以用户 method 获得 :c 的函数主体,然后调用 call 调用它。
涉及到 2 个背景知识:
1.符号
符号 用 :xxx
来表示。符号用于 方法名、类名、常量。符号是一种特殊的数据类型,他唯一、检索速度快。所以被用于前者。想想是不是很合理?非常合理。为了性能。
2.返回值
ruby 认为所有函数都应该有返回。即使是返回空,也是一种返回。所以除了 显示调用 return 返回值,默认没有 return 的情况下,返回方法内最后一个计算值。它相当于
def a
return def c
'hello,world'
end
end
所以这里,函数内部被调用,没有 return 情况下,会返回 内部定义的函数名,函数名用符号表示,所以返回 :c
微软可以用 Mac 么
+1
所以都切换为电脑版搞
SQL 特殊地方,他是一个 三元逻辑系统 true、false、null 逻辑处理的时候,必须要考虑 null,除非这个字段加了 非 null 约束。
他的布尔值运算,也要遵循三元真值表。
(前几天看了,逃。。。
感觉远程这件事,算时间成本、租办公区成本,应该是比较共赢的。只是这个想法里面,对打工人利好,管理者应该不想。
速度上来了。以前 gitlab.com 访问起来非常非常慢
可以这样理解。毕竟 KPI 驱动、急功近利的晋升导向的不良氛围,而且维护性根本不可靠。而且做来做去就那点东西抄抄弄弄的。
实话是活,和国外还是有点差距。
他们家网站的插画,真是喜欢