小编and*_*ich的帖子

我可以动态定义一个占用块的Ruby方法吗?

我知道我可以使用动态定义类的方法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对我来说不是一个选择.这是一个棘手的问题,还是有办法绕过它?

ruby metaprogramming ruby-1.9 ruby-1.8

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

术语:类和组件之间有什么区别?

在OO范例中,我们选择使用类,因为它们有助于我们打破系统,并提供良好的附带好处,如封装,职责分离,继承,模块化等.

如果我们在组件级别查看软件系统,我们是否可以简单地以相同的概念方式处理组件,即组件只是一个"大类"?或者还有更多呢?

在设计组件时必须考虑哪些额外的因素?

编辑:

我知道一个类和一个组件是不同的东西.我也理解一个组件可能包含许多类,每个类都有自己的角色和职责.

我会看看能否更好地解释自己.

  • 课程允许我们解决更大的问题,因为它们允许我们更抽象地思考和设计.
  • 有一些规则和技术可以确定如何分解和为类分配数据和功能.

这似乎与组件设计非常相似,只是在更高的抽象层次上.用于确定需要哪些类的技术可以扩展到组件,还是有其他影响高级系统设计但不适用于类抽象级别的方法?

architecture oop terminology

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

在运行时以递归方式为RSpec测试文件生成glob

我有一套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)

但我怀疑我不应该这样做.我对吗?

ruby rspec rspec2

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

使用标记的联合类型时"无法找到模式"

有一个跨多个模块的应用程序.首先,我模拟我的问题,创建几种数据类型.在第二个,我正在提出意见.

其中一种类型是标记的联合类型:

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)

我想"也许我应该导出标签以及类型?",但是既没有将标签添加到模块导出也没有 …

elm

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

了解命令式并发编程的最佳方法是什么?

最近我不得不编写我的第一个"正确的"多线程编码,并且意识到我对"命令式"(即C++/C#/ Java等使用的并发模型)并发编程技术的了解程度.

有哪些资源(包括书籍和在线教程等)以便更多地了解这个编码区域?

注意:我不是要问可以说更好的并发模型(Erlang的消息传递,或Clojure的STM),只是在命令式语言中使用的范例.

concurrency multithreading

4
推荐指数
2
解决办法
1496
查看次数

Ruby:字符串比较问题

我目前正在学习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)

ruby string

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

绘制一个类图

我得到了类名,属性和方法. 类

我不确定他们之间的关系是什么,所以如果有人能在我开始画画之前纠正我,我会很感激:

游戏与体育有一对多的关系.体育与赛事有一对多的关系.活动与Race有一对多的关系.

而Heat和Final是Race的子类.

你怎么看?

uml class-diagram

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

如何在Crystal中访问对象的本征类?

在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实现这一目标吗?

crystal-lang

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

为什么我不能在 const 数组中创建有效索引类型?

考虑以下:


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)

type-inference tuples typescript

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