小编mis*_*lav的帖子

在一组字符串中查找最长的公共起始子字符串

对于一个相对微不足道的问题,提出最优雅的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来试用它: …

javascript ruby python haskell longest-prefix

39
推荐指数
6
解决办法
3万
查看次数

在没有"autoload"的情况下在Ruby中自动加载类

我喜欢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 …

ruby lazy-loading autoload

21
推荐指数
1
解决办法
3735
查看次数

在设置环境变量时从ruby中取出shell

我需要在为其设置环境变量时为一个进程进行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)

我被迫这么长的表达式,因为我不想永久覆盖环境变量,如果它已经有一个值.

想到什么更短的东西?

ruby shell environment

20
推荐指数
2
解决办法
9800
查看次数

模仿另一个Ruby类,以便对象传递===类型检查

我想创建一个充当特定类的对象,例如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)

ruby types class mocking

10
推荐指数
2
解决办法
1348
查看次数

内容在离线网络应用加载时消失了几分之一秒

我在iOS 4.3到5.0上观察过这个.当你创建一个简单的离线Web应用程序,意味着一个HTML文件+少量资产,如CSS和JS(都存在于缓存清单中),它可以脱机工作(我在飞行模式下测试) - 但是,当你添加这样的应用程序到您的主屏幕并以全屏模式打开它,它首先显示初始内容,然后一切消失(页面变为白色)半秒或更长时间,然后内容再次出现.

你可以通过将一个众所周知且有用的离线网络应用程序Glyphboard添加到你的iOS主屏幕并启动它几次来看到这一点.每次加载时都应该看到白色闪光效果.

这是一个很大的问题,因为它会泄露应用程序的非原生性,并给人的印象是应用程序未针对性能和错误进行优化.

我已经尝试过找到关于此的报告,但我能找到的只是关于iOS 4.3 JavaScript渲染引擎惨败的谣言和误解,这根本不需要与此问题相关.但是在iOS版本3中,我记得没有看到过白色闪光.

html5 offline ios web

8
推荐指数
1
解决办法
1699
查看次数

为Phusion Passenger应用程序设置环境变量

我已经在开发中设置了Passenger(Mac OS X),它可以完美运行.唯一的问题出现了:现在我安装了自定义GEM_HOME路径和ImageMagick二进制文件"/usr/local".我可以把它们放在一个获取源代码的shell rc文件中,这解决了从控制台生成的进程的环境变量; 但乘客怎么样?以这种方式运行时,相同的应用程序无法找到我的宝石.

ruby env ruby-on-rails passenger

7
推荐指数
1
解决办法
1万
查看次数

与平台无关的检测git是否已安装的方法

这就是我在ruby中检测git的方法:

`which git 2>/dev/null` and $?.success?
Run Code Online (Sandbox Code Playgroud)

但是,这不是跨平台的.它在非unix系统或没有which命令的系统上失败(虽然我不确定它们是什么).

我需要一种方法来检测满足这些条件的git:

  1. 即使在Windows上,也可以跨平台工作
  2. 不会向$ stdout或$ stderr输出任何内容
  3. 少量的代码

更新:解决方案是避免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?使用反引号时所需的行程.

ruby windows git shell detect

6
推荐指数
1
解决办法
987
查看次数

如何使用文字标量样式在YAML中转储字符串?

我有我想要使用红宝石精极度紧张转储到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中的文字样式输出.

ruby string yaml psych

5
推荐指数
1
解决办法
2537
查看次数