Tag: 方法

Ruby:自动将实例变量设置为方法参数?

是否有任何计划实现类似于在方法参数列表中指定实例变量名称的CoffeeScriptfunction的ruby行为? 喜欢 class User def initialize(@name, age) # @name is set implicitly, but @age isn’t. # the local variable “age” will be set, just like it currently works. end end 我知道这个问题: 在Ruby中,我可以在initialize方法中以某种方式自动填充实例变量吗? ,但所有的解决方案(包括我自己的)似乎都不符合ruby简单哲学。 并且,这种行为会有任何缺点吗? UPDATE 其中一个原因是ruby社区的DRY(不要重复自己)哲学。 我经常发现自己需要重复参数变量的名称,因为我希望将它分配给同名的实例变量。 def initialize(name) # not DRY @name = name end 我能想到的一个缺点是,如果一个方法没有正文,它看起来好像什么也没做。 如果您正在快速扫描,这可能看起来像一个无操作。 但我认为,只要有时间,我们就可以适应。 另一个缺点:如果您在正文中设置其他实例变量,并且您尝试通过将所有分配放在开头可读,则可能需要更多的认知“权力”才能看到分配也发生在参数列表中。 但我不认为这比看到一个常量或方法调用并且不得不跳到它的定义更难。 # notice: instance var […]

创建一个在Ruby中获取额外参数的setter方法

我正在尝试编写一个充当setter的方法,除了赋值之外还需要一些额外的参数。 愚蠢的例子: class WordGenerator def []=(letter, position, allowed) puts “#{letter}#{allowed ? ‘ now’ : ‘ no longer’} allowed at #{position}” end def allow=(letter, position, allowed) # … end end 把它写成索引器是有效的,我可以像这样调用它: gen = WordGenerator.new gen[‘a’, 1] = true # or explicitly: gen.[]=(‘a’, 1, true) 但当我尝试以下任何一种情况时,口译员会抱怨: gen.allow(‘a’, 1) = false # syntax error gen.allow=(‘a’, 1, false) # […]

为什么Ruby只允许某些运算符重载

在Ruby中,与许多其他OO编程语言一样,运算符是可重载的。 但是,只有某些字符运算符可以重载。 此列表可能不完整,但是,以下是一些无法重载的运算符: !, not, &&, and, ||, or

如何将方法动态定义为私有?

这似乎不起作用: class Test private define_method :private_method do “uh!” end end puts Test.new.private_method

为什么方法调用在原则上可以是常量时需要消除歧义?

方法调用通常可以省略接收器和参数的括号: def foo; “foo” end foo # => “foo” 在上面的例子中, foo在方法调用和对潜在局部变量的引用之间是不明确的。 在没有后者的情况下,它被解释为方法调用。 但是,当方法名称原则上可以是常量名称时(即,当它以大写字母开头,并且仅包含字母时),它似乎需要消除歧义。 def Foo; “Foo” end Foo # => NameError: uninitialized constant Foo Foo() # => “Foo” self.Foo # => “Foo” 为什么会这样? 为什么即使没有具有相同名称的常量,也需要将方法调用与对常量的引用明确区分开来?

Ruby方法’to_sym’做什么?

to_sym方法有什么作用? 它是干什么用的?

nil的未定义方法’>’:NilClass

好的,我有以下代码 def update_state_actions states.each do |state| @state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1 end end 现在在…… @state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1 它说错误 in ‘block update_state_actions’ : Undefined method ‘>’ for nil:NilClass 错误的原因是什么? 怎么来>被认为是一种方法,但它是一个逻辑运算符?

Ruby函数与方法

在Ruby Programming Language ,第6章(第2段)中,他们指出: 许多语言区分没有关联对象的函数和在接收器对象上调用的方法。 因为Ruby是纯粹面向对象的语言,所以所有方法都是真正的方法,并且至少与一个对象相关联。 然后在第6段的中间: procs和lambdas都是函数而不是在对象上调用的方法。 我对这些陈述有点困惑。 Ruby是纯粹的纯OO,因此没有与对象无关的函数(如果这是纯OO的有效定义),或者是与Proc对象关联的procs / lambdas? Ruby中的函数和方法有什么区别? 任何帮助解析和理解这将是值得赞赏的。

在Ruby中,为什么在使用“do”和“end”时,方法调用不能被视为一个单元?

以下问题与“ Ruby Print Inject Do Syntax ”问题有关。 我的问题是,我们可以坚持使用do和end并使其与puts或p吗? 这有效: a = [1,2,3,4] b = a.inject do |sum, x| sum + x end puts b # prints out 10 所以,是正确的说, inject是Array对象的实例方法,这个实例方法接受一段代码,然后返回一个数字。 如果是这样,那么它应该与调用函数或方法并返回返回值没有什么不同: b = foo(3) puts b 要么 b = circle.getRadius() puts b 在以上两种情况下,我们可以直接说 puts foo(3) puts circle.getRadius() 因此,无法通过以下两种方式直接使其工作: a = [1,2,3,4] puts a.inject do |sum, […]

Ruby运算符方法调用与普通方法调用

我想知道为什么调用操作符方法不需要点? 或者更确切地说,为什么不能在没有点的情况下调用普通方法? 例 Foo级 def +(对象) 把“这会起作用” 结束 def plus(对象) 把“这不会” 结束 结束 f = Foo.new f +“任何事情”#“这会起作用” f加“任何”#NoMethodError:未定义的方法`plus’表示main:Object