相关疑难解决方法(0)

如何让我的数组只在Ruby中本地操作(在函数内)?

当我运行下面的ruby代码时,为什么我的数组被全局操作?我怎样才能在函数范围内操作数组?

a = [[1,0],[1,1]]

def hasRowsWithOnlyOnes(array)
  array.map { |row|
    return true if row.keep_if{|i| i != 1 } == []
  }
  false;
end

puts a.to_s
puts hasRowsWithOnlyOnes(a)
puts a.to_s
Run Code Online (Sandbox Code Playgroud)

$ ruby test.rb 输出:

[[1, 0], [1, 1]]
true
[[0], []]
Run Code Online (Sandbox Code Playgroud)

我无法让它发挥作用.我甚至试过.select{true}把它分配给一个新名字.范围如何在Ruby for Arrays中运行?仅供参考$ ruby -v:

ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud)

ruby arrays scope

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

Ruby - 按值传递

有没有办法按值传递对象而不是Ruby中的引用?例如,

class Person
  attr_accessor :name
end
def get_name(obj)
  obj.name = "Bob"
  puts obj.name
end
jack = Person.new
jack.name = "Jack"
puts jack.name
get_name(jack)
puts jack.name
Run Code Online (Sandbox Code Playgroud)

输出应该是

Jack
Bob
Jack
Run Code Online (Sandbox Code Playgroud)

代替

Jack
Bob
Bob
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

ruby object

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

为什么将哈希集更新为变量更新该变量?

我可以将哈希集更新为另一个变量,如下所示:

d = a = {b: 'c'}

a[:b] = 'qwerty'
d # => {:b=>'qwerty'} # What is this magic?

d[:b] = 'blah'
a # => {:b=>'blah'} # And this magic?
Run Code Online (Sandbox Code Playgroud)

为什么在使用原始变量时不会发生这种情况?

d = a = 'b'

a = 'c'
d # =>'b' # Why is it still the same?
Run Code Online (Sandbox Code Playgroud)

ruby

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

Ruby赋值行为

请帮忙找一些下一个行为的文章.

a = 'qwer'
a = b
b << 'ty'
puts b # => 'qwerty'
puts a # => 'qwerty'
Run Code Online (Sandbox Code Playgroud)

但如果

a = 'qwer'
a = b
b = 'ty'
puts b # => 'ty'
puts a # => 'qwer'
Run Code Online (Sandbox Code Playgroud)

我知道为什么在这种情况下

我知道它运作良好,但我找不到解释 - 为什么如此

PS

如果适用 - 请提供有关此主题的文章的链接(或类似的可能我想念这样的更有趣的功能).

THN.

ruby

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

为什么这个ruby代码没有按预期工作?

我正在研究在ruby中学习一些Hash操作.代码是关于将每件商品的价格提高10%.为什么这段代码不起作用?

restaurant_menu = { "Ramen" => 3, "Dal Makhani" => 4, "Coffee" => 2 }
restaurant_menu.each do |item, price|
  price = price + (price * 0.1)
end
Run Code Online (Sandbox Code Playgroud)

虽然这个做了:

restaurant_menu = { "Ramen" => 3, "Dal Makhani" => 4, "Coffee" => 2 }
restaurant_menu.each do |item, price|
  restaurant_menu[item] = price + (price * 0.1)
end
Run Code Online (Sandbox Code Playgroud)

至于为什么后者比@Mike Manfrin所解释的更好的方式呢?

ruby

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

Array#map 返回意外值

我使用此代码得到了意外的返回值:

str = ''; 'abc'.chars.map {|c| str<<c}
Run Code Online (Sandbox Code Playgroud)

预期输出:

["a", "ab", "abc"]
Run Code Online (Sandbox Code Playgroud)

实际输出:

["abc", "abc", "abc"]
Run Code Online (Sandbox Code Playgroud)

添加puts(str)用于调试:

str = ''; 'abc'.chars.map {|c| puts(str); str<<c}

a
ab
=> ["abc", "abc", "abc"]
Run Code Online (Sandbox Code Playgroud)

为什么上面的代码没有返回预期的输出?谢谢。

ruby arrays

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

ruby pop数组,不影响其他变量

当我尝试从数组中弹出一个元素时,它会弹出.当我在弹出之前将该数组分配给另一个变量然后如果我弹出时,弹出操作会影响两个数组.

例如:

 ruby-1.9.2-p290 :339 > a= [1,2,3]
     => [1, 2, 3] 
    ruby-1.9.2-p290 :340 > b = a
     => [1, 2, 3] 
    ruby-1.9.2-p290 :341 > a
     => [1, 2, 3] 
    ruby-1.9.2-p290 :342 > b
     => [1, 2, 3] 
    ruby-1.9.2-p290 :343 > a.pop
     => 3 
    ruby-1.9.2-p290 :344 > a
     => [1, 2] 
    ruby-1.9.2-p290 :345 > b
     => [1, 2] #WHY?
    ruby-1.9.2-p290 :346 > x = [1,2,3]
     => [1, 2, 3] 
    ruby-1.9.2-p290 :347 > y = x
     => [1, 2, 3] 
    ruby-1.9.2-p290 :348 …
Run Code Online (Sandbox Code Playgroud)

ruby arrays reference

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

传递值是什么意味着Ruby?

我显然不太了解传递值.

irb(main):001:0> a="UPPER CASE STRING"
=> "UPPER CASE STRING"
irb(main):002:0> b=a
=> "UPPER CASE STRING"
irb(main):003:0> a
=> "UPPER CASE STRING"
irb(main):004:0> b
=> "UPPER CASE STRING"
irb(main):005:0> b.downcase
=> "upper case string"
irb(main):006:0> a
=> "UPPER CASE STRING"
irb(main):007:0> b.downcase!
=> "upper case string"
irb(main):008:0> b
=> "upper case string"
irb(main):009:0> a
=> "upper case string"
irb(main):010:0>
Run Code Online (Sandbox Code Playgroud)

为什么是小写,如果通过值然后不是一个副本?

这是因为a是String对象的(引用|指针),因此b是指针的副本而不是对象吗?

ruby

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

Ruby修改"each"块中的哈希值.传递价值的微妙之处?

根据这个问题,红宝石是严格按价值传递的.我遇到了一个案例,其中包括修改哈希,如下所示:

h = {"one" => ["un", "ein"], "two"=> ["deux", "zwei"]}
h.each { |k,v| v << "overriden"}
Run Code Online (Sandbox Code Playgroud)

导致:

{"one"=>["un", "ein", "overriden"], "two"=>["deux", "zwei", "overriden"]}
Run Code Online (Sandbox Code Playgroud)

但是,以下行为有所不同:

h = {"one" => "un", "two"=> "deux"}
h.each { |k,v| v = "overriden"}
Run Code Online (Sandbox Code Playgroud)

导致:

{"one"=>"un", "two"=>"deux"}
Run Code Online (Sandbox Code Playgroud)

我怎么能预测到这个?

ruby pass-by-value

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

Ruby:数组是通过引用传递给函数的吗?

我在下面有一个简单的代码

    def testarray
      arr_tree = [1,2,3,4,5]
      (1..3).each do |index|
        abcde(arr_tree)
        puts arr_tree[0]
      end
    end

    def abcde(node_tree)
      node_tree[0] += 100
    end
Run Code Online (Sandbox Code Playgroud)

所以在 testarray 函数中,我有一个arr_tree传递给函数的数组abcde。我在abcde函数内部更改数组的值并在内部打印数组testarray我在这里得到更改的值。所以输出是

101
201
301
Run Code Online (Sandbox Code Playgroud)

但我期待

1
1
1
Run Code Online (Sandbox Code Playgroud)

请解释为什么结果是这样?另外我怎样才能达到我的预期结果?

ruby arrays pass-by-reference

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

为什么我们可以修改复杂参数但不修改ruby函数中的标量?

问题是Ruby通过引用或值传递?吸引了很多有用的答案,也有很多不同意见.到目前为止,我在任何答案中都没有看到的是解释以下内容的任何内容:

ruby -e "def f(x) x=7 end; a=3; f(a); print a" 打印3.

ruby -e "def f(x) x[0]=7 end; a=[3]; f(a); print a[0]" 打印7.

根据经验,这看起来像标量对象和更复杂的对象(如散列和数组)之间存在某种区别,标量通过引用传递给值和复杂对象.这类似于C的语义.

我的理解是ruby中的所有东西都是一个对象,而早期问题的答案都没有提到标量和复杂类型之间的区别.那么我的描述是错误的,如果是,那么更好的描述是什么?

ruby pass-by-reference

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

'upcase!' 不要在 Ruby 中改变一个变量?

我只是想确保我了解这里发生了什么。我知道 += 是重新分配,所以也许这就是为什么 str 没有被修改但为什么upcase!这里也不修改 str ?

def change_me(str)
  str += "?"
  str.upcase!
end

question = "whats your name"
change_me(question)

puts question

'whats your name'
=> nil
Run Code Online (Sandbox Code Playgroud)

ruby

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

为什么在类中返回变量变量

我无法理解这种红宝石行为,代码更好地解释了我的意思:

class DoNotUnderstand
    def initialize
        @tiny_array = [3,4]
        test
    end

    def messing(ary)
        return [ary[0]+=700, ary[1]+=999]
    end

    def test
        puts @tiny_array.join(",")  # before => 3,4
        messing(@tiny_array)
        puts @tiny_array.join(",")  # after  => 703,1003
    end
end

question = DoNotUnderstand.new
Run Code Online (Sandbox Code Playgroud)

@tiny_array是的[3,4],[703,1003]
如果我不使用课程,那就会发生:

@tiny = [1,2]
def messing(ary)
    return [ary[0]+693,ary[1]+999]
end

puts @tiny.join(",")                        # before  => 1,2
messing(@tiny)
puts @tiny.join(",")                        # after   => 1,2
Run Code Online (Sandbox Code Playgroud)

数组只是[1,2]
为什么?

ruby variables class

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