- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
(交叉贴:一周前我已经在 Ruby Forum 上问过这个问题,但还没有得到任何回复)。
这是我目前拥有的(非常)简化的工作版本:
# A class S with two methods, one which requires one parameter, and
# one without parameters.
class S
def initialize(s); @ms = s; end
def s_method1(i); puts "s_method1 #{i} #{@ms}"; end
def s_method2; puts "s_method2 #{@ms}"; end
end
# A class T which uses S, and "associates" itself to
# one of the both methods in S, depending on how it is
# initialized.
class T
def initialize(s, choice=nil)
@s = S.new(s)
# If choice is true, associate to the one-parameter-method, otherwise
# to the parameterless method.
@pobj = choice ? lambda { @s.s_method1(choice) } : @s.method(:s_method2)
end
# Here is how I use this association
def invoke
@pobj.call
end
end
在此示例中,根据 T 的构造方式,T#invoke 调用S#s_method1 或 S#S_method2,但在调用的情况下S#s_method1,s_method1 的参数在创建时已经固定T对象的时间。因此,以下两行,
T.new('no arguments').invoke
T.new('one argument', 12345).invoke
产生输出
s_method2 no arguments
s_method1 12345 one argument
这正是我需要的。
现在回答我的问题:
在这种情况下,choice
是 nil,即我想调用无参数方法 s_method2
,我可以在一个优雅的方式
@s.method(:s_method2)
如果 choice
不是nil,我必须构造一个 Proc
对象使用`lambda。这不仅看起来笨拙,而且让我觉得有点不舒服。我们这里有一个闭包,它连接到初始化方法中的环境,我不确定这是否在某些情况下可能会导致内存泄漏,从而引起麻烦。
有没有一种简单的方法来简单地绑定(bind)一个方法对象(在这种情况下@s.method(:s_method1)
到固定参数?
我的第一个想法是使用
@s.method(:s_method1).curry[choice]
但这并没有达到我的目的。它不会返回可调用的 Proc
对象,而是实际执行 s_method1
(这不是错误,而是有记录的行为)。
关于如何实现我的目标还有其他想法吗?
最佳答案
这个选项很简单,但它可能不是您要找的:
class T
def initialize(s, choice=nil)
s = S.new(s)
@choice = choice
@pobj = s.method(choice ? :s_method1 : :s_method2)
end
def invoke
@pobj.call(*@choice)
end
end
T.new('no arguments').invoke
T.new('one argument', 12345).invoke
#=> s_method2 no arguments
#=> s_method1 12345 one argument
# Allows setting default parameters for methods, after they have been defined.
module BindParameters
refine Method do
def default_parameters=(params)
@default_params = params
end
def default_parameters
@default_params || []
end
alias_method :orig_call, :call
def call(*params)
merged_params = params + (default_parameters[params.size..-1] || [])
orig_call(*merged_params)
end
end
end
这是一个例子:
def f(string)
puts "Hello #{string}"
end
def g(a, b)
puts "#{a} #{b}"
end
using BindParameters
f_method = method(:f)
f_method.default_parameters = %w(World)
f_method.call('user') # => Hello user
f_method.call # => Hello World
g_method = method(:g)
g_method.default_parameters = %w(Hello World)
g_method.call # => Hello World
g_method.call('Goodbye') # => Goodbye World
g_method.call('Goodbye', 'User') # => Goodbye User
您的代码可以重写:
class T
using BindParameters
def initialize(s, *choice)
s = S.new(s)
@pobj = s.method(choice.empty? ? :s_method2 : :s_method1)
@pobj.default_parameters = choice
end
def invoke
@pobj.call
end
end
T.new('no arguments').invoke # => s_method2 no arguments
T.new('one argument', 12_345).invoke # => s_method1 12345 one argument
如果修补方法类是可以接受的,您可以使用:
class Method
def default_parameters=(params)
@default_params = params
end
def default_parameters
@default_params || []
end
alias_method :orig_call, :call
def call(*params)
merged_params = params + (default_parameters[params.size..-1] || [])
orig_call(*merged_params)
end
end
T 变成:
class T
def initialize(s, *choice)
s = S.new(s)
@pobj = s.method(choice.empty? ? :s_method2 : :s_method1)
@pobj.default_parameters = choice
end
def invoke
@pobj.call
end
end
如果你不想污染方法类,这种方式可能更干净:
class MethodWithDefaultParameters
attr_accessor :default_parameters
attr_reader :method
def initialize(receiver, method_symbol)
@method = receiver.public_send(:method, method_symbol)
@default_parameters = []
end
def call(*params)
merged_params = params + (default_parameters[params.size..-1] || [])
method.call(*merged_params)
end
def method_missing(sym, *args)
method.send(sym, *args)
end
end
T 变成:
class T
def initialize(s, *choice)
s = S.new(s)
@pobj = MethodWithDefaultParameters.new(s, choice.empty? ? :s_method2 : :s_method1)
@pobj.default_parameters = choice
end
def invoke
@pobj.call
end
end
欢迎任何意见或建议!
关于ruby - 是否可以将参数绑定(bind)到(一元)Proc 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41116975/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!