对于一个相对微不足道的问题,提出最优雅的JavaScript,Ruby或其他解决方案是一项挑战.
此问题是最长公共子字符串问题的更具体情况.我只需要在数组中找到最长的公共起始子字符串.这大大简化了问题.
例如,最长的子串[interspecies, interstelar, interstate]是"inters".但是,我不需要找到"ific" [specifics, terrific].
我已经通过快速编写JavaScript解决方案来解决这个问题,作为我关于类似shell的选项卡完成的答案的一部分(这里是测试页面).这是解决方案,略有调整:
function common_substring(data) {
var i, ch, memo, idx = 0
do {
memo = null
for (i=0; i < data.length; i++) {
ch = data[i].charAt(idx)
if (!ch) break
if (!memo) memo = ch
else if (ch != memo) break
}
} while (i == data.length && idx < data.length && ++idx)
return (data[0] || '').slice(0, idx)
}
Run Code Online (Sandbox Code Playgroud)
此代码在此Gist中提供,以及Ruby中的类似解决方案.您可以将gist克隆为git repo来试用它: …
我喜欢Ruby的自动加载功能 ; 然而,它在未来的Ruby版本中消失了,因为它从来都不是线程安全的.
所以现在我想通过自己实现延迟加载机制来假装它已经消失并在没有它的情况下编写我的代码.我想以最简单的方式实现它(我现在不关心线程安全性).Ruby应该允许我们这样做.
让我们从扩充一个类开始const_missing:
class Dummy
def self.const_missing(const)
puts "const_missing(#{const.inspect})"
super(const)
end
end
Run Code Online (Sandbox Code Playgroud)
当我们尝试引用缺少的"Dummy"下的常量时,Ruby会调用这个特殊方法,例如,如果我们尝试引用"Dummy :: Hello",它将const_missing使用Symbol 调用:Hello.这正是我们所需要的,所以让我们进一步:
class Dummy
def self.const_missing(const)
if :OAuth == const
require 'dummy/oauth'
const_get(const) # warning: possible endless loop!
else
super(const)
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我们引用"Dummy :: OAuth",它将需要"dummy/oauth.rb"文件,该文件应该定义"Dummy :: OAuth"常量.当我们调用时const_get(因为它可以在const_missing内部调用),有可能出现无限循环,但是防止这种情况超出了这个问题的范围.
最大的问题是,如果在顶级命名空间中存在名为"OAuth"的模块,则整个解决方案会崩溃.引用"Dummy :: OAuth"将跳过它const_missing,只返回顶层的"OAuth".大多数Ruby实现也会对此发出警告:
warning: toplevel constant OAuth referenced by Dummy::OAuth
Run Code Online (Sandbox Code Playgroud)
据报道,这在2003年是一个问题,但我找不到Ruby核心团队曾经关注这个问题的证据.今天,大多数流行的Ruby实现都具有相同的行为.
问题是,const_missing在顶级命名空间中默认跳过有利于常量的问题.如果使用Ruby的autoload …
我需要在为其设置环境变量时为一个进程进行shell.我试过这个单行:
system "RBENV_VERSION=system ruby extconf.rb"
Run Code Online (Sandbox Code Playgroud)
此语法适用于shell脚本,但不适用于ruby.(更新:事实证明这个语法毕竟是来自ruby,但由于我的特殊用例,我没有看到它的效果.)
所以我这样做:
rbenv_version = ENV['RBENV_VERSION']
ENV['RBENV_VERSION'] = 'system'
begin
system "ruby extconf.rb"
ensure
ENV['RBENV_VERSION'] = rbenv_version
end
Run Code Online (Sandbox Code Playgroud)
我被迫这么长的表达式,因为我不想永久覆盖环境变量,如果它已经有一个值.
想到什么更短的东西?
我想创建一个充当特定类的对象,例如Fixnum,但它不是该类的实例,也不是它的子类.
有各种用例.在Fixnum的情况下,我想定义一个更具体的整数类型,它本质上是一个Fixnum,但也实现了一些额外的逻辑.我不能将Fixnum本身子类化,因为Fixnum和Symbol等直接类型不能被子类化.
另一个用例是在自动化测试中进行模拟:有时您想要创建一个像某个类(通常是模型实例)的对象,但出于技术原因而不是该类的实例.
以下是如何创建一个特定的整数类型,将所有方法委托给内部存储的fixnum:
require 'delegate'
require 'forwardable'
# integer representing a page number
class PageNumber < DelegateClass(Integer)
extend Forwardable
def initialize(value, name)
@name = name
super(value)
end
def inspect
"#{@name} #{to_i}"
end
alias_method :to_i, :__getobj__
def_delegators :to_i, :instance_of?, :kind_of?, :is_a?
end
Run Code Online (Sandbox Code Playgroud)
此对象可以通过is_a?和类似的检查:
page = PageNumber.new(1, "page")
page.is_a? Fixnum #=> true
Run Code Online (Sandbox Code Playgroud)
但我没做什么可以让它通过Module#===类型检查:
# my problem:
Fixnum === page #=> false
Run Code Online (Sandbox Code Playgroud)
我的对象未通过此检查这一事实非常不幸,因为该===方法在case语句内部使用:
case page
when Fixnum
# it will never get here
when …Run Code Online (Sandbox Code Playgroud) 我在iOS 4.3到5.0上观察过这个.当你创建一个简单的离线Web应用程序,意味着一个HTML文件+少量资产,如CSS和JS(都存在于缓存清单中),它可以脱机工作(我在飞行模式下测试) - 但是,当你添加这样的应用程序到您的主屏幕并以全屏模式打开它,它首先显示初始内容,然后一切消失(页面变为白色)半秒或更长时间,然后内容再次出现.
你可以通过将一个众所周知且有用的离线网络应用程序Glyphboard添加到你的iOS主屏幕并启动它几次来看到这一点.每次加载时都应该看到白色闪光效果.
这是一个很大的问题,因为它会泄露应用程序的非原生性,并给人的印象是应用程序未针对性能和错误进行优化.
我已经尝试过找到关于此的报告,但我能找到的只是关于iOS 4.3 JavaScript渲染引擎惨败的谣言和误解,这根本不需要与此问题相关.但是在iOS版本3中,我记得没有看到过白色闪光.
我已经在开发中设置了Passenger(Mac OS X),它可以完美运行.唯一的问题出现了:现在我安装了自定义GEM_HOME路径和ImageMagick二进制文件"/usr/local".我可以把它们放在一个获取源代码的shell rc文件中,这解决了从控制台生成的进程的环境变量; 但乘客怎么样?以这种方式运行时,相同的应用程序无法找到我的宝石.
这就是我在ruby中检测git的方法:
`which git 2>/dev/null` and $?.success?
Run Code Online (Sandbox Code Playgroud)
但是,这不是跨平台的.它在非unix系统或没有which命令的系统上失败(虽然我不确定它们是什么).
我需要一种方法来检测满足这些条件的git:
更新:解决方案是避免which完全使用并将输出重定向到NULWindows.
require 'rbconfig'
void = RbConfig::CONFIG['host_os'] =~ /msdos|mswin|djgpp|mingw/ ? 'NUL' : '/dev/null'
system "git --version >>#{void} 2>&1"
Run Code Online (Sandbox Code Playgroud)
该system命令在成功时返回true,在失败时返回false,从而节省了$?.success?使用反引号时所需的行程.
我有我想要使用红宝石精极度紧张转储到YAML格式的数据(例如JSON)的大串,同时保留格式.
基本上,我希望JSON使用文字样式出现在YAML中:
---
json: |
{
"page": 1,
"results": [
"item", "another"
],
"total_pages": 0
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用YAML.dump它时不使用文字样式.我得到这样的东西:
---
json: ! "{\n \"page\": 1,\n \"results\": [\n \"item\", \"another\"\n ],\n \"total_pages\":
0\n}\n"
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉Psych将scalars转换为想要的风格?
非常感谢Aaron Patterson提出的我正在扩展的解决方案:https://gist.github.com/2023978
虽然有点冗长,但这个要点是一种标记ruby中某些字符串的工作方式,使用YAML中的文字样式输出.