Ruby简单类问题

Ruby简单类问题,ruby,class,Ruby,Class,我要说的是,这似乎是工作,但它不是 class Person1 def initialize (name, surname, age) @name = name @surname = surname @age = age end def introduction p @name p @surname p @age end end 我称之为: ken = Person1.new ("Ken", "Bolo", 4) ken.int

我要说的是,这似乎是工作,但它不是

class Person1
  def initialize (name, surname, age)
    @name = name
    @surname = surname
    @age = age
  end

  def introduction
    p @name
    p @surname
    p @age
  end
end
我称之为:

ken = Person1.new ("Ken", "Bolo", 4)
ken.introduction
并与编译器就我为实例化对象而传递的参数数量进行争论。3是告诉我我有很多,2是告诉我它太多了,1是告诉我它太少了!胡说


提前感谢。

只需删除方法名称和括号之间的空白:

class Person1
  def initialize(name, surname, age)
    @name = name
    @surname = surname
    @age = age
  end

  def introduction
    p @name
    p @surname
    p @age
  end
end

ken = Person1.new("Ken", "Bolo", 4)
ken.introduction
#=> "Ken"
#=> "Bolo"
#=> 4

只需删除方法名称和括号之间的空白:

class Person1
  def initialize(name, surname, age)
    @name = name
    @surname = surname
    @age = age
  end

  def introduction
    p @name
    p @surname
    p @age
  end
end

ken = Person1.new("Ken", "Bolo", 4)
ken.introduction
#=> "Ken"
#=> "Bolo"
#=> 4

只需删除
Person1.new
之间的空格,或者删除括号:
Person1.new“Ken”,“Bolo”,4
@CarySwoveland:初始值设定项定义遇到了同样的问题永远不要在方法名和开始括号之间留空格。相信我们。稍后你就会知道为什么:)是一位来自日出之地的智者在这个主题上发表的一些词(虽然不是确定的)。如果方法名称后面跟有
),那么似乎方法名称后面的空格就被忽略了,即
def foo(a,b)
相当于
def foo(a,b)
,因此有效。
def foo(a),b
相当于
def foo(a),b
,因此无效。
def foo a,(b)
另一方面相当于
def foo(a,(b))
,这是有效的。只需删除
Person1.new
(“Ken”,“Bolo”,4)
之间的空格或删除括号:
Person1.new“Ken”,“Bolo”,4
@CarySwoveland:初始值设定项的定义也有同样的问题,永远不要在方法名和左括号之间留空格。相信我们。稍后你就会知道原因:)关于这个问题的一些话是由一位来自日出之地的智者说的(尽管不是确定的)。如果方法名称后面紧跟着
,即
def foo(a,b)
相当于
def foo(a,b)
,则方法名称后面的空格将被忽略。
def foo(a),b
相当于
def foo(a),b
,因此无效。
def foo a,(b)
另一方面相当于
def foo(a,(b))
,这是有效的。好吧,斯皮克曼,为什么在某些情况下允许空格,而在其他情况下不允许空格?简单:允许:
foo.bar(a;b;c)
非常好,例如,括号用于参数列表和参数列表(如果它们直接出现在消息发送之后)和分组,在这种情况下,它们将三个表达式分组在一起。在OP的情况下,分组的表达式是
“Ken”,“Bolo”,4
,这根本不是语法上合法的表达式。顺便说一句:这完全相同的问题(和答案)已经发布过好几次了。大多数副本都比这一个有更好、更详细的解释。@JörgWMittag,我似乎引入了一个红鲱鱼,因为我注意到
def initialize(姓名、姓氏、年龄)中的第二个空格
还可以。当然可以——它是方法定义的一部分,而不是被调用的方法的参数。允许使用第二个空格,因为它不会引起歧义吗?我不确定你的意思。有两种方法可以将参数传递给消息发送:1)在消息名称后面直接插入括号,2)使用空格。OP选择了选项2:用空格传递参数。他通过了多少次辩论?我们用括号来分组表达式,所以一个带括号的表达式算作一个表达式,因此,他传递了一个参数。但是这个方法需要三个步骤。而且,他通过的论点在语法上是无效的。所有这些都在已经存在的许多问题中的一个问题中得到了更好的解释。为什么在某些情况下允许使用空格,而在其他情况下不允许使用空格?很简单:它是允许的:
foo.bar(a;b;c)
非常好,例如。括号用于参数列表、参数列表(如果它们直接出现在消息发送之后)和分组,在本例中,它们将三个表达式分组在一起。在OP的例子中,分组表达式是
“Ken”,“Bolo”,4
,这根本不是一个语法上合法的表达式。顺便说一句:这个完全相同的问题(和答案)已经发布了好几次了。大多数副本都有比这一个更好、更详细的解释。@JörgWMittag,我似乎引入了一条红鲱鱼,因为我注意到
def initialize(name,姓氏,age)
中的第二个空格还行。当然没关系——它是方法定义的一部分,而不是被调用方法的参数。第二个空格是允许的,因为它不会引起歧义吗?我不知道你的意思。有两种向消息发送传递参数的方法:1)在消息名称后面直接加括号,2)加空格。OP选择了选项2:用空格传递参数。他通过了多少次辩论?我们用括号来分组表达式,所以一个带括号的表达式算作一个表达式,因此,他传递了一个参数。但是这个方法需要三个步骤。而且,他通过的论点在语法上是无效的。所有这一切都在这个问题已经存在的众多重复中得到了更好的解释。