小编Jos*_*ver的帖子

在Ruby符号的上下文中,"taguri"是什么意思?

我和我的一位同事试图理解为什么在对它们执行正则表达式匹配时,符号不会自动进行字符串化:

>> :this =~ /./
=> false
>> :this =~ :this
=> false
>> :this =~ /:this/
=> false
Run Code Online (Sandbox Code Playgroud)

一种理论是Symbol覆盖了:=〜方法,所以我们检查了:this.methods.我们发现Symbol不会覆盖:=〜(1),但也注意到一种非常奇怪的方法:

>> :this.respond_to? :taguri=
=> true
Run Code Online (Sandbox Code Playgroud)

在日本,たぐり(taguri)的意思是"缫丝(线头等)"(2),但我不能为我的生命搞清楚什么是有一个符号做了,我找不到红宝石Symbol类中方法的源代码.

有线索吗?

ruby

2
推荐指数
1
解决办法
587
查看次数

Ruby 1.8是否相当于1.9的__callee__?

我需要在Ruby 1.8中获取词法封闭方法的名称; 例如

def foo
  this_method = __callee__  # => 'foo'
end
Run Code Online (Sandbox Code Playgroud)

上面的代码在Ruby 1.9中有效,但在1.8中失败,因为1.9中引入了__callee__.

有没有在1.8中做到这一点的建议?内核#caller看起来很有前途,但似乎给了我调用堆栈,从方法的调用者开始,而不是方法本身.

我想我可以抛出一个异常,抓住它,并抓住Exception #backtrace数组中的第一个元素,但我的直觉告诉我将会很慢.

ruby introspection

2
推荐指数
1
解决办法
323
查看次数

为什么添加到C++ STL向量的对象的地址与其原始地址不同?

我有一个非常简单的方法,可以在图形中添加一个节点:

  template<class T>
  void AdjacencyList<T>::add(const GraphNode<T>& node) {
    _nodes.push_back(node);
  }
Run Code Online (Sandbox Code Playgroud)

在另一种方法中,我迭代_nodes向量,按地址查找添加的节点:

for (unsigned int i = 0; i < _nodes.size(); i++) {
  if (&(_nodes[i]) == &node)
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为当我添加node_nodes向量时,添加的成员具有不同的地址:

Graph::AdjacencyList<int>::add (this=0x8052338, node=...) at ../AdjacencyList.h:42
42      _nodes.push_back(node);
(gdb) p node
$1 = (const Graph::GraphNode<int> &) @0xbffff39c: {value = 123}
(gdb) n
43      }
(gdb) p _nodes[0]
$4 = (Graph::GraphNode<int> &) @0x80522b0: {value = 123}
Run Code Online (Sandbox Code Playgroud)

世界上到底发生了什么?更重要的是,我应该如何在向量中添加成员以便以后可以找到它?

c++ stl

2
推荐指数
1
解决办法
150
查看次数

通过 clojure.tools.logging 在同一命名空间中使用多个记录器

我正在使用clojure.tools.logging,它使用slf4j工厂来实例化Logback记录器。

我想要做的是能够让我的 DAO 命名空间将正常消息记录到应用程序日志中,但将所有 SQL 查询记录到查询日志中。

查看clojure.tools.logging 代码,这看起来不太可能,但我希望有人能证明我错了。:)

如果 clojure.tools.logging 不能做到这一点,有人可以建议另一种可以完成我想要的日志记录工具吗?或者是否可以在 Logback 的配置文件中进行路由?

logging clojure logback

2
推荐指数
1
解决办法
288
查看次数

如何编写带时区但没有时间部分的ISO 8601日期

具有时区的ISO 8601日期时间的格式如下:

2018-09-07T05:28:42Z
Run Code Online (Sandbox Code Playgroud)

但是,我需要在系统中表示一些日期,其精度是天,而不是秒,这意味着它将是ISO 8601日历日期。日历日期的格式如下:

2018-09-07
Run Code Online (Sandbox Code Playgroud)

在有关该标准的Wikipedia文章中(我无权访问该标准本身,因为您必须为此特权付费),在讨论日期时没有提及时区。它确实谈到了省略部分时间:

为了简洁起见,基本或扩展时间格式中都可以省略秒或分钟和秒,但会降低精度:[hh]:[mm],[hh] [mm]和[hh]是降低的精度时间格式。

由此看来,您似乎不能省略小时,因此我无法这样写一个日历日期:

2018-09-07TZ
Run Code Online (Sandbox Code Playgroud)

看来,我能做的最好的事情就是缩短时间:

2018-09-07T00Z
Run Code Online (Sandbox Code Playgroud)

但是,如果我可以避免的话,我就不想这样做,因为我为日期添加的精度比实际的精度更高。该日期表示“在UTC时区的2018年9月7日的某个时间”,而不是“在UTC时区的2018年9月7日的午夜的某个时间”。

有什么建议么?

language-agnostic datetime date iso8601 timezone-offset

2
推荐指数
1
解决办法
1453
查看次数

如何在ActiveScaffold中为文本输入设置默认值?

如何使用ActiveScaffold 1.2RC1为文本输入设置默认值?

对于更高版本,它看起来像这样(来自http://activescaffold.com/2010/7/21/changes-in-naming-schema-for-overrides)应该工作:

module PlayersHelper
  def player_name_form_column(record, options)
    text_field :record, :name, options.merge(:value => record.name || 'new player')
  end
end
Run Code Online (Sandbox Code Playgroud)

但它出现在1.2RC1中,列形式覆盖方法将输入名称作为第二个参数.我试过这个:

module PlayersHelper
  def player_name_form_column(record, _)
    text_field :record, :name, {:value => record.name || 'new player'}
  end
end
Run Code Online (Sandbox Code Playgroud)

但它没有效果.

更新

我的第二次尝试确实有效.事实上,这两项工作:

    text_field :record, :name, {:value => record.name || 'new player'}
    text_field :record, :name, :value => (record.name || 'new player')
Run Code Online (Sandbox Code Playgroud)

有趣的是,ActiveScaffold实际上会将数据库中列的默认值传播到输入表单!我的玩家表看起来像这样:

mysql> show create table players\G
*************************** 1. row ***************************
       Table: players
Create Table: CREATE TABLE `players` (
  `id` …
Run Code Online (Sandbox Code Playgroud)

activescaffold ruby-on-rails

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

如果某家工厂存在,我可以问工厂女孩吗?

我有一系列模型,我已经定义了工厂.我还有一个基于API的模型,它的子类ActiveResource::Base,我(显然)不能从工厂构建 - 当Factory Girl调用时我得到一个例外FooAPI.new.

我改为定义了一个Footest/lib.我想在我的测试做的是看是否存在某个符号(如工厂:foo,:bar等等),然后回落到试图直接建立相应的类的对象,使用String#classify.constantize.这是我目前笨重的实现:

  objects[name] = begin
    klass = name.to_s.classify.constantize
    klass.new
  rescue
    Factory.build name
  end
Run Code Online (Sandbox Code Playgroud)

我更喜欢这样的东西:

Factory.exists?(name) ? Factory.build(name) : name.to_s.classify.constantize.new
Run Code Online (Sandbox Code Playgroud)

这样,我就会在构造对象失败时得到一个适当的例外.

更新:感谢fd,我找到了一种方法来做到这一点,无需异常处理!

  objects[name] = if Factory.factories.include?(name)
    Factory.build name
  else
    klass = name.to_s.classify.constantize
    klass.new
  end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails factory-bot

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

导航传染媒介传染媒介对在Clojure的哈希传染媒介

我在2D空间中有一个点矢量,例如:

[[0 0] [1 1] [2 2]]
Run Code Online (Sandbox Code Playgroud)

并且需要计算某个点与向量中每个点之间的距离,以确定向量中的哪个点最接近我正在查询的点.我需要知道距离和最近点,所以我想要一个像这样的哈希矢量:

[{:point [0 0] :dist 2.7} {:point [1 1] :dist 3.5} {:point [2 2] :dist 4.3}]
Run Code Online (Sandbox Code Playgroud)

我如何将前者转变为后者?我试过这样的事情:

(defn closest-point [point all-points]
    (map #({:point % :dist (distance point %)}) all-points))
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

(user=> ArityException Wrong number of args (0) passed to: PersistentArrayMap  clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)

functional-programming clojure

1
推荐指数
2
解决办法
1225
查看次数

在Clojure中转换地图的键

我正在使用REST API来表示具有以下JSON的帐户:

{ "userName": "foo", "password": "bar", "emailId": "baz" }
Run Code Online (Sandbox Code Playgroud)

我有一个Clojure函数来创建一个可以这样调用的帐户:

(create-account :username "foo" :password "bar" :email "baz")
Run Code Online (Sandbox Code Playgroud)

我想要做的是将好的密钥映射create-account到REST API期望的时髦密钥.我目前的解决方案是:

(def clj->rest {:username :userName
                :email :emailId})

(apply hash-map
       (flatten (map
                 (fn [[k v]] [(or (clj->rest k) k) v])
                 args)))  ;; args is the arguments to create-account, as above
Run Code Online (Sandbox Code Playgroud)

有没有更惯用的方法来实现这一目标?

clojure

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

Guice可以断言单例不是直接实例化的吗?

如果我尝试构造单例的新实例,Guice是否可能抛出异常?

例如:

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MySingleton.class).in(Singleton.class);
    }
}

@Singleton
public class MySingleton {
    MySingleton() { /* ... */ }
}

public class RightWay {
    public void withInjector() {
        Injector injector = Guice.createInjector(new MyModule());
        MySingleton mySingleton = injector.getInstance(MySingleton.class);
    }
}

public class AnotherRightWay {
    private final MySingleton mySingleton;

    @Inject
    public AnotherRightWay(MySingleton mySingleton) {
        this.mySingleton = mySingleton;
    }
}

public class TheWrongWay {
    public void directInstantiation() {
        MySingleton mySingleton = new MySingleton(); // I …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection guice

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