Что действительно выстраивает * строка, средняя в Ruby?

Я просматривал некоторый исходный код направляющих и столкнулся

# File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb, line 129
129:     def target!
130:       @target * ''
131:     end

Что делает *, '' делают? То умножение пустой строкой...? И почему Вы сделали бы это.

14
задан Aaron Yodaiken 31 December 2016 в 01:50
поделиться

5 ответов

Я бы сказал, что вероятно и статистика является наиболее важной предпосылкой. Особенно 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 ), вы получите три конкатенированные копии массива.

14
ответ дан 1 December 2019 в 10:02
поделиться

Это странный синтаксис. Они эквивалентны:

>> [1, 2, 3] * 'joiner'
=> "1joiner2joiner3"

>> [1, 2, 3].join 'joiner'
=> "1joiner2joiner3"

, поэтому в этом случае он объединяет все записи @ target в одну последовательность, причем между записями ничего нет.

Примечание: если вы делаете что-то вроде [1, 2, 3] * 3 (используя int вместо str ), вы получите три конкатенированные копии массива.

-121--2681464-

Он делает то же самое, что:

["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'

Так что я могу сделать вывод, что это конкатанация всех элементов массива без каких-либо разделителей.

4
ответ дан 1 December 2019 в 10:02
поделиться

Массив#* с аргументом Строка эквивалентна Массив#join.

2
ответ дан 1 December 2019 в 10:02
поделиться

Два комментария:

  1. Наличие! конец имени метода подразумевает, что это операция изменения, которой в этом примере не является.

  2. Как утверждали другие, это действительно загадочно. Я бы выбрал @ target.to_s или @ target.join

1
ответ дан 1 December 2019 в 10:02
поделиться

Он делает то же самое, что:

["foo","bar","baz"].join

http://ruby-doc.org/core/classes/Array.html#M002210

Согласно предложению ZED, вы должны использовать его, если хотите запутать людей и сделайте ваш код более подверженным ошибкам.

6
ответ дан 1 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: