我和我的一位同事试图理解为什么在对它们执行正则表达式匹配时,符号不会自动进行字符串化:
>> :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 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数组中的第一个元素,但我的直觉告诉我将会很慢.
我有一个非常简单的方法,可以在图形中添加一个节点:
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)
世界上到底发生了什么?更重要的是,我应该如何在向量中添加成员以便以后可以找到它?
我正在使用clojure.tools.logging,它使用slf4j工厂来实例化Logback记录器。
我想要做的是能够让我的 DAO 命名空间将正常消息记录到应用程序日志中,但将所有 SQL 查询记录到查询日志中。
查看clojure.tools.logging 代码,这看起来不太可能,但我希望有人能证明我错了。:)
如果 clojure.tools.logging 不能做到这一点,有人可以建议另一种可以完成我想要的日志记录工具吗?或者是否可以在 Logback 的配置文件中进行路由?
具有时区的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日的午夜的某个时间”。
有什么建议么?
如何使用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) 我有一系列模型,我已经定义了工厂.我还有一个基于API的模型,它的子类ActiveResource::Base,我(显然)不能从工厂构建 - 当Factory Girl调用时我得到一个例外FooAPI.new.
我改为定义了一个Foo类test/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) 我在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) 我正在使用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)
有没有更惯用的方法来实现这一目标?
如果我尝试构造单例的新实例,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)