所以问题不在最初那个函数,而是编译器没料到在 union 里放 bool 这种骚操作……
写 Dictionary 字面量麻烦…… 最后还是在 .net 用 Scriban 这种类似 Ruby 语法的模板引擎舒服
几种写法各有利弊,Ruby 不做裁决,而是把自由裁量的权力交给你。
你的编辑器支持这些小功能就不会难受了:一键切换后缀 if / unless,一键切换 do ... end 和 {}
ppt 很弱🐔就不放了,还是看 Rust by Example 这种更好
其实一行 def 挺流行的,我发现 DotNet 的模板引擎 Scriban 也加入了 smart mode 支持 def foo(x, y) = ...
卸腰,还没学会 Rust,有点方……
不是,是在客户端造个假的 API 例如用 msw https://mswjs.io/docs/
假设你有个 API 不想走服务器渲染了,就在客户端 mock 之,修改之前服务器返回的响应,交给 mock service worker 就可以了
Turbolinks 还有返回的页面过大,渲染过多消耗服务器 CPU 和传输带宽的问题。
一些 render partial 可以用 custom element 代替,那样返回的内容就接近 json ajax 了,只是你用 HTML 格式化而已。
不过 custom element 也有难用的地方……
不过 Stimulus 还是有些比较难搞的问题,controller 其实并没有很好的 scope 控制。
重交互的页面或者树形的节点,得把 controller 放在比较高的节点里,并且最好只出现一次。
我甚至搞了个 stimulus-bind 去做绑定,然后就能类似 vue / react 的写 class,不用手动 add / remove class 了
不过由于实现过于简陋,要触发更新得更新 root object。或许现在有更好的办法
下面说一下 turbolinks 5 和 ujs 的一些坑,我们知道使用 turbolinks 之后,内部链接之间切换不会刷新页面,体验要比每次重新刷新页面好很多,但对于服务器端来说,整个页面还是要渲染一遍,相关的查询也要执行一遍,想有更好的体验也需要一些专门的 ajax 的请求,返回局部内容,比如分页和过滤场景。
其实可以用 service worker 来处理一些 URL,然后就不会访问到服务器啦。具体例子在:
地毯的正确维护方式,是整个换掉拿去专门的厂里清洗。低成本的维护方式是拿吸尘器吸,那就会变成细菌乐园。
text.gsub!(/\[quote\].*?\[uid.*?\](.*?)\[\/uid\].*?\[\/b\](.*?)\[\/quote\]/m){
author = $1
mid = $2.gsub("\n", "\n>")
">#{author} 说:\n>#{mid}\n"
}
我很久之前也尝试了下做一个 Windows 下的 Ruby GUI 框架,基本就是在 C-ext 里包装 Win32API,然后展示一个比较简洁友好的(类似 Shoes / REBOL view)的编程环境。
代码在 https://github.com/luikore/cici2 可以参考下,只是现在 Ruby / Windows API 已不同跑不起来了。
有些坑分享一下:
如果让我再来一遍的话,我会选择改造成两个进程:一个 Ruby 进程负责处理事件和返回 DOM tree,一个原生 GUI 进程负责转发事件给后面的 Ruby 进程。这样就可以避掉上面的一些坑并且可以统一处理好转码。GUI 进程用纯 C 的 Win32 API 搞,或者现在流行的什么 WPF 搞都可以了。
参考书就是特别古老的 Programming Windows。
有道理…… 那我也支持
就差实现性能超过数组 sort 然后 bsearch 了
Ruby 标准库缺的数据结构多了去了,例如 list,double array,burst tree,radix tree,merkle-patricia tree,HAMT,HAT-tree …… 为何厚此薄彼?
我明白红黑树是入门数据结构书讲的,但就一定比别的数据结构有用咩?
事实上,当我们需要一棵特别大的平衡树的时候,我们就用数据库,例如 redis 的 zset
显然也能做管理 timer 等用途……
我觉得平衡树的应用场景被好多基础软件做了,以至于在 Ruby 中并没有什么发挥的空间了
你一定要 trap CHLD 的话,可以试试在 C 里 trap, 这样可能可以绕过 Ruby 的 hijack ...
另外用 system 成本不一定高的,测测才知道
我猜你调用的这个接口是启动了一个子进程,然后让子进程输出一些东西,然后 recv 这些东西。
然而子进程退出时会发出 SIGCHILD 信号,信号正好在 recv 调用中被父进程收到,然后就 EINTR 了。
建议想办法更改子进程退出的时机,或者父进程不要 wait 子进程,或者把子进程的管理在 Ruby 里做。
又或者,把调用 DLL 的代码写成不依赖 Ruby 的独立可执行文件 (不过我怀疑依然会 EINTR),在 Ruby 里 system
或者 backtick 调用。
还好,编辑器可以一键切换前后缀表达
用 delete_if
可以稍微再简单点
def SQLBuilder s
SQLBuilder.new s
end
SQLBuilder("SELECT * FROM users")...
你可以网上搜索一下“如何看网页的源代码”
Qt 还有一步 connect counter, :onchange, led_screen, :onchange
你没写。
Qt 这么做其实很绕,原因是传递函数的话,类型写起来会很复杂,所以才用 signal / slot 的方式解耦合。
然而 Ruby method call 就已经是 signal / slot 机制了。简单实现 (也可以抽出个 connect() 函数做点元编程):
class Counter
def initialize
@onchange = []
end
def onchange method
@onchange << method
end
def increment
@value.succ!
@onchange.each {|m| m.(@value) }
end
end
class LedScreen
def onchange v
@value = v
display
end
def display
end
end
counter = Counter.new
led_screen = LedScreen.new
counter.onchange led_screen.method :display
当然上面的实现有个问题,就是事件触发没有异步化,在事件响应的触发点,把 method call 扔到别的执行线程就完整了。
Cocoa 也有类似机制,叫 responder
差点骗了我一个赞…… 在这个论坛骗赞有意义吗?
富文本编辑器不是用 textarea 实现的,这个 textarea 只是一个方便初始化的东西。js 执行后会把它隐藏掉。
真正的实现是 js 生成一个 div 元素并且使它进入 edit mode
你给的这个 md 编辑器是用 codemirror 实现的,你可以搜索一下 codemirror 的文档看看
tf = tf.sub(t1, '')
太慢,可以改成 tf = tf[t1.size..]
因为单引号里面反斜线基本就是反斜线而不是转义字符, '\n'
相当于 "\\n"
你的代码早就 O(n) * m 了
应该是你修改了传入的参数 nums 造成的问题
在方法体开头加一行 nums = nums.dup 应该就好