Я просматривал некоторый исходный код направляющих и столкнулся
# File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb, line 129
129: def target!
130: @target * ''
131: end
Что делает *, '' делают? То умножение пустой строкой...? И почему Вы сделали бы это.
Я бы сказал, что вероятно и статистика является наиболее важной предпосылкой. Особенно Gaussian Mixe Models (GMM) и Hidden Markov Models ( HMM ) очень важны как в машинном обучении, так и в обработке естественного языка (конечно, эти предметы могут быть частью курса, если он является вводным).
Тогда я бы сказал, что базовые знания CS также полезны, например, Алгоритмы , Формальные языки и основная теория сложности .
-121--1174065-Это реализация, сделанная для КОНЕЧНЫХ ОТРЕЗКОВ, а не бесконечных прямых, как большинство других функций (вот почему я сделал это).
Реализация теории Полом Бурком .
Python:
def dist(x1, y1, x2, y2, x3, y3): # x3,y3 is the point
px = x2-x1
py = y2-y1
norm = px*px + py*py
u = ((x3 - x1) * px + (y3 - y1) * py) / float(norm)
if u > 1:
u = 1
elif u < 0:
u = 0
x = x1 + u * px
y = y1 + u * py
dx = x - x3
dy = y - y3
# Note: If the actual distance does not matter,
# if you only want to compare what this function
# returns to other results of this function, you
# can just return the squared distance instead
# (i.e. remove the sqrt) to gain a little performance
dist = (dx*dx + dy*dy)**.5
return dist
AS3:
public static function segmentDistToPoint(segA:Point, segB:Point, p:Point):Number
{
var p2:Point = new Point(segB.x - segA.x, segB.y - segA.y);
var something:Number = p2.x*p2.x + p2.y*p2.y;
var u:Number = ((p.x - segA.x) * p2.x + (p.y - segA.y) * p2.y) / something;
if (u > 1)
u = 1;
else if (u < 0)
u = 0;
var x:Number = segA.x + u * p2.x;
var y:Number = segA.y + u * p2.y;
var dx:Number = x - p.x;
var dy:Number = y - p.y;
var dist:Number = Math.sqrt(dx*dx + dy*dy);
return dist;
}
Java
private double shortestDistance(float x1,float y1,float x2,float y2,float x3,float y3)
{
float px=x2-x1;
float py=y2-y1;
float temp=(px*px)+(py*py);
float u=((x3 - x1) * px + (y3 - y1) * py) / (temp);
if(u>1){
u=1;
}
else if(u<0){
u=0;
}
float x = x1 + u * px;
float y = y1 + u * py;
float dx = x - x3;
float dy = y - y3;
double dist = Math.sqrt(dx*dx + dy*dy);
return dist;
}
-121--534362- Это странный синтаксис. Они эквивалентны:
>> [1, 2, 3] * 'joiner'
=> "1joiner2joiner3"
>> [1, 2, 3].join 'joiner'
=> "1joiner2joiner3"
, поэтому в этом случае он объединяет все записи @ target
в одну последовательность, причем между записями ничего нет.
Примечание: если вы делаете что-то вроде [1, 2, 3] * 3
(используя int
вместо str
), вы получите три конкатенированные копии массива.
Это странный синтаксис. Они эквивалентны:
>> [1, 2, 3] * 'joiner'
=> "1joiner2joiner3"
>> [1, 2, 3].join 'joiner'
=> "1joiner2joiner3"
, поэтому в этом случае он объединяет все записи @ target
в одну последовательность, причем между записями ничего нет.
Примечание: если вы делаете что-то вроде [1, 2, 3] * 3
(используя int
вместо str
), вы получите три конкатенированные копии массива.
Он делает то же самое, что:
["foo","bar","baz"].join
http://ruby-doc.org/core/classes/Array.html#M002210
Согласно предложению Z.E.D., вы бы использовали его, если хотите запутать людей и сделать ваш код более подверженным ошибке.
-121--2681465-Действительно криптический код.
После проверки исходного кода я понял, что @ target
на самом деле является экземпляром Array
, я знаю, что вы можете делать подобные вещи
[5] * 5 # => [5,5,5,5,5]
Я не знаю, где определен Array # *
(может быть, в ActiveSupport
), но я могу вам сказать, что это поведение, когда оно умножается на Последовательности
[1,2,3] * 'comma' # => "1comma2comma3"
[1,2,3] * '' # => '123'
Так что я могу сделать вывод, что это конкатанация всех элементов массива без каких-либо разделителей.
Массив#*
с аргументом Строка
эквивалентна Массив#join
.
Два комментария:
Наличие! конец имени метода подразумевает, что это операция изменения, которой в этом примере не является.
Как утверждали другие, это действительно загадочно. Я бы выбрал @ target.to_s или @ target.join
Он делает то же самое, что:
["foo","bar","baz"].join
http://ruby-doc.org/core/classes/Array.html#M002210
Согласно предложению ZED, вы должны использовать его, если хотите запутать людей и сделайте ваш код более подверженным ошибкам.