令我困惑的一个基本例子:
def [](row, col)
self[row][col]
end
x = [[1,3], [4,5]]
x[0][0] #normal
x[0, 0] #syntactic sugar?
我被告知这些是等同的陈述,但当我运行糖时,我会得到一个不同的答案。我怎么能用语法糖写它?
答案 0 :(得分:3)
您需要将$ irb
2.3.0 :001 > class MyData
2.3.0 :002?> attr_accessor :my_array
2.3.0 :003?> def [](row, col)
2.3.0 :004?> my_array[row][col]
2.3.0 :005?> end
2.3.0 :006?> end
=> :[]
2.3.0 :007 > x = MyData.new
=> #<MyData:0x007f96dc8024b8>
2.3.0 :008 > x.my_array = [[1, 3], [4, 5]]
=> [[1, 3], [4, 5]]
2.3.0 :009 > x[1,1]
=> 5
2.3.0 :010 >
方法放在包含数据的类中。如下所示:
@media (-ms-high-contrast: none), (-ms-high-contrast: active) {
.yourTargetClass:before {
content: "";
position: absolute;
height: 100%;
width: 100%;
background-image: linear-gradient(-221deg, rgba(205,234,255,0.41), rgba(227,253,255,0.82)); /* THIS IS WHAT EVER OVERLAY COLOUR YOU WANT */ }
opacity:0.55;
}
}
答案 1 :(得分:1)
这有两个问题:
Object
课程。但是Array
有自己的[]
会覆盖Object
中的那个,所以你的方法永远不会被调用... ArgumentError
。现在,忘记修补核心课程的那一刻是可怕的想法,你可以到这个:
module TwoDArrayExtension
def [](x, y)
super(x).method(__callee__).super_method.(y)
end
end
class Array
prepend TwoDArrayExtension
end
x = [[1, 3], [4, 5]]
x[0][0] #normal
# in `[]': wrong number of arguments (given 1, expected 2) (ArgumentError)
# Hey, we just re-defined [] to take two arguments, so obviously this cannot work!
x[0, 0] #syntactic sugar?
#=> 1
这“工作”意味着它会让你的语法糖示例通过。但是您的“正常”示例现在已经破坏:您已经重新定义了数组的工作方式,因此您不能再像数组一样使用它。修补像这样的核心课程有严重的后果。例如:
简而言之:是的,你可以这样做,但你真的,真的,真的,真的不想。< / p>