我知道我可以使用动态定义类的方法define_method,并且我使用块的arity指定此方法所使用的参数.
我想动态定义一个接受可选参数和块的方法.在Ruby 1.9中,这很容易,因为现在允许将块传递给块.
不幸的是,Ruby 1.8不允许这样做,所以以下内容不起作用:
#Ruby 1.8
class X
define_method :foo do |bar, &baz|
puts bar
baz.call if block_given?
end
end
x = X.new
x.foo("foo") { puts "called!"} #=> LocalJumpError: no block given
Run Code Online (Sandbox Code Playgroud)
替换显式block.call,yield也不能解决问题.
遗憾的是,升级到Ruby 1.9对我来说不是一个选择.这是一个棘手的问题,还是有办法绕过它?
在OO范例中,我们选择使用类,因为它们有助于我们打破系统,并提供良好的附带好处,如封装,职责分离,继承,模块化等.
如果我们在组件级别查看软件系统,我们是否可以简单地以相同的概念方式处理组件,即组件只是一个"大类"?或者还有更多呢?
在设计组件时必须考虑哪些额外的因素?
编辑:
我知道一个类和一个组件是不同的东西.我也理解一个组件可能包含许多类,每个类都有自己的角色和职责.
我会看看能否更好地解释自己.
这似乎与组件设计非常相似,只是在更高的抽象层次上.用于确定需要哪些类的技术可以扩展到组件,还是有其他影响高级系统设计但不适用于类抽象级别的方法?
我有一套RSpec测试,我想在以下层次结构下进行分组:
tests/
featA/
t1.rb
t2.rb
featB/
t3.rb
Run Code Online (Sandbox Code Playgroud)
但是当我跑
$ rspec tests
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
rspec tests
No examples were matched. Perhaps {:unless=>#<Proc:0x00007f318919cc08@/usr/lib/ruby/gems/1.8/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:51>, :if=>#<Proc:0x00007f318919cdc0@/usr/lib/ruby/gems/1.8/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:50>} is excluding everything?
Finished in 0.00003 seconds
0 examples, 0 failures
Run Code Online (Sandbox Code Playgroud)
我觉得我很生气,但是似乎没有办法让RSpec递归地为测试文件生成?这个功能是否存在?
编辑:
我有一个解决方法:
$ rspec `find tests -name "*.rb"`
Run Code Online (Sandbox Code Playgroud)
但我怀疑我不应该这样做.我对吗?
我有一个跨多个模块的应用程序.首先,我模拟我的问题,创建几种数据类型.在第二个,我正在提出意见.
其中一种类型是标记的联合类型:
type alias Letter = Char
type GuessedLetter = Guessed Letter | Unguessed
Run Code Online (Sandbox Code Playgroud)
在我的View模块中,我有一个显示字母的功能:
guessToChar : GuessedLetter -> Char
guessToChar guess =
case guess of
Guessed l -> l
Unguessed -> '_'
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译这些文件时,我收到以下错误:
## ERRORS in src/Views.elm #####################################################
-- NAMING ERROR -------------------------------------------------- src/Views.elm
Cannot find pattern `Guessed`
21| Guessed l -> l
^^^^^^^^^
-- NAMING ERROR -------------------------------------------------- src/Views.elm
Cannot find pattern `Unguessed`
22| Unguessed -> '_'
^^^^^^^^^
Detected errors in 1 module.
Run Code Online (Sandbox Code Playgroud)
我想"也许我应该导出标签以及类型?",但是既没有将标签添加到模块导出也没有 …
最近我不得不编写我的第一个"正确的"多线程编码,并且意识到我对"命令式"(即C++/C#/ Java等使用的并发模型)并发编程技术的了解程度.
有哪些资源(包括书籍和在线教程等)以便更多地了解这个编码区域?
注意:我不是要问可以说更好的并发模型(Erlang的消息传递,或Clojure的STM),只是在命令式语言中使用的范例.
我目前正在学习Ruby,除了一个小字符串比较问题外,我正在享受所有的一切.
answer = gets()
if (answer == "M")
print("Please enter how many numbers you'd like to multiply: ")
elsif (answer. == "A")
print("Please enter how many numbers you'd like to sum: ")
else
print("Invalid answer.")
print("\n")
return 0
end
Run Code Online (Sandbox Code Playgroud)
我正在做的是我正在使用gets()来测试用户是想要将它们的输入相乘还是添加它(我已经测试了两个函数;它们都可以工作),我后来得到了一些更多的输入函数和浮点转换(这也有效).
会发生什么事情,我输入A,然后我得到"无效答案."M也是如此.
这里发生了什么?(我也使用了.eql?(sp),它也返回了bubcus)
我得到了类名,属性和方法. 
我不确定他们之间的关系是什么,所以如果有人能在我开始画画之前纠正我,我会很感激:
游戏与体育有一对多的关系.体育与赛事有一对多的关系.活动与Race有一对多的关系.
而Heat和Final是Race的子类.
你怎么看?
在Ruby中,可以通过重新打开来访问对象的本征类(或"单例类").这对于定义"私有类方法"特别有用:
class Foo
class << self
private
def declarative_method_name
end
end
declarative_method_name
end
# Foo.declarative_method_name => ERROR!
Run Code Online (Sandbox Code Playgroud)
但是,在Crystal中这不是语法:
Syntax error in ./test.cr:2: expecting token 'CONST', not '<<'
class << self
^
Run Code Online (Sandbox Code Playgroud)
目前还有另一种(或实际上是任何)方法在Crystal实现这一目标吗?
考虑以下:
const STATES = ["Todo", "In Progress", "Blocked", "Done"] as const;
type State = typeof STATES[number]; // "Todo" | "In Progress" | "Blocked" | "Done"
type StateIndex = keyof typeof STATES; // number | keyof STATES
// so this works:
let goodIndex: StateIndex = 0;
// but so does this
let badIndex : StateIndex = 42;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,STATES对于TS编译器来说是完全已知的,所以它的长度也是(4)。StateIndex那么为什么评估类型为
number | keyof STATES
Run Code Online (Sandbox Code Playgroud)
并不是
0 | 1 | 2 | 3
Run Code Online (Sandbox Code Playgroud)
?
我知道可以用其他方式定义类型:
type StateIndex = 0 | 1 | …Run Code Online (Sandbox Code Playgroud) ruby ×3
architecture ×1
concurrency ×1
crystal-lang ×1
elm ×1
oop ×1
rspec ×1
rspec2 ×1
ruby-1.8 ×1
ruby-1.9 ×1
string ×1
terminology ×1
tuples ×1
typescript ×1
uml ×1