今天,我偶然发现了Ruby中神秘的Data类,我找不到任何有用的信息,或者它为什么存在.我认为它是语言实现本身的一部分.
有人知道它的作用吗?
mbp-scott:~ scott$ irb
ruby-1.9.3-p0 :001 > Data
=> Data
ruby-1.9.3-p0 :002 > Data.is_a? Module
=> true
ruby-1.9.3-p0 :003 > Data.is_a? Class
=> true
ruby-1.9.3-p0 :004 > Data.ancestors
=> [Data, Object, Kernel, BasicObject]
ruby-1.9.3-p0 :005 > Data.methods
=> [:allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>,
:>=, :to_s,:included_modules, :include?, :name, :ancestors, :instance_methods,
:public_instance_methods, :protected_instance_methods, :private_instance_methods,
:constants, :const_get, :const_set, :const_defined?, :const_missing, :class_variables,
:remove_class_variable, :class_variable_get, :class_variable_set,
:class_variable_defined?, :public_constant, :private_constant, :module_exec,
:class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?,
:private_method_defined?, :protected_method_defined?, :public_class_method
:private_class_method, …Run Code Online (Sandbox Code Playgroud) Ruby 1.9.2中的新哈希语法意味着我可以执行以下操作:
my_hash = {a: 1, b: 2, c: 3}
Run Code Online (Sandbox Code Playgroud)
......相当于:
my_hash = {:a => 1, :b => 2, :c => 3}
Run Code Online (Sandbox Code Playgroud)
好的,所以使用旧的语法可以做到这一点(第一个键是一个整数):
my_hash = {1 => 1, :b => 2, :c => 3}
Run Code Online (Sandbox Code Playgroud)
而且我发现甚至可以将新语法和旧语法混合使用:
my_hash = {1 => 1, b: 2, c: 3}
Run Code Online (Sandbox Code Playgroud)
因此,如果我们援引"最少惊喜原则",人们会认为以下是合法的:
my_hash = {1: 1, b: 2, c: 3}
Run Code Online (Sandbox Code Playgroud)
......但事实并非如此.它会生成语法错误:
SyntaxError: (irb):40: syntax error, unexpected '='
my_hash = = {1: 1, b: 2, c: 3}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这是否是解析器的限制,还是有很好的理由说明为什么这是不可能的,或允许的?
在MacVim中,我在所有缓冲区中编辑的文本都在缓冲区的左侧卡住了.我发现这在视觉上非常刺耳,特别是如果我正在观察垂直分裂.
看起来我的文本和窗口边框之间只有一个像素.
是否有设置允许我将字符宽度添加为装订线或边距?
我想知道在F#中是否有一些糖来克隆一个只改变一个或几个属性的类实例.
我知道在F#中可以使用记录:
let p2 = {p1 with Y = 0.0}
Run Code Online (Sandbox Code Playgroud) 在Clojure中,我希望有一个协议,其中一些方法具有默认实现,而一些方法具有自定义实现.第一个用于配置后者.这是一个例子:
(defprotocol Saving
(save [this] "saves to mongodb")
(collection-name [this] "must return a string representing the associated MongoDB collection"))
;Default implementation
(extend-type Object
Saving
; the `save` method is common for all, so it is actually implemened here
(save [this] (mc/insert (collection-name [this]) this))
; this method is custom to every other type
(collection-name [this] "no_collection"))
;Particular implementations
(defrecord User
[login password]
Saving
(collection-name [this] "users"))
(defrecord NewsItem
[text date]
Saving
(collection-name [this] "news_items"))
Run Code Online (Sandbox Code Playgroud)
但是,它不会以这种方式工作.即使调用collection-name一个User或NewsItem …
我在一些C#代码中有以下方法:
Qux MyFunc(Foo foo, Bar bar, int baz = 1);
Run Code Online (Sandbox Code Playgroud)
我想将它添加为我的新F#Record类型的字段.我将稍后将C#函数分配给我的记录字段,使用F#代码.
如果我忽略了最终参数baz的默认属性,那么我的类型将如下所示:
type MyType = {
MyFunc: Foo * Bar * int -> Qux
}
Run Code Online (Sandbox Code Playgroud)
但是,因为我们有可选的C#参数,所以我想反映一下.我已尝试使用此处提到的Optional属性,但它不起作用:
type MyType = {
MyFunc: Foo * Bar * [<Optional;DefaultParameterValue(null)>] int -> Qux
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他组合,例如问号前缀?baz.
这样做的正确方法是什么(如果可能的话)?
更新和摘要
虽然这是可能做到这一点类型成员,它是不是能够做到这一点的一个值(录音).我正在使用F#3.1,所以将来可能会这样.
为了公平地奖励积分,我将赞成@ Daniel-Fabian,他确认了这种情况,并将@ Mark-Seemann的解决方案作为答案,因为虽然这不是我想要的答案,但它解决了我的问题.问题.
我一直在阅读文档以获得ActiveRecord验证ActiveModel.出于某种原因,我没有看到任何返回的验证结果.
我有一组模型,ActiveRecord它们通过一个将位于Rails后面的自定义API连接而不是接口.
该模型:
class ApiObject < ApiConnector
include ActiveModel::Validations
attr_accessor :fieldName
validates :fieldName, :presence => true
def save
#save method implementation
end
end
Run Code Online (Sandbox Code Playgroud)
控制者:
def create
@apiObject = ApiObject.new(params[:api_object])
respond_to do |format|
if @apiObject.save
format.html { redirect_to(@apiObject, :notice => 'User was successfully created.') }
format.xml { render :xml => @apiObject, :status => :created, :location => @apiObject }
else
format.html { render :action => "new" }
format.xml { render :xml => @apiObject.errors, :status => :unprocessable_entity …Run Code Online (Sandbox Code Playgroud)